javascript - 自定义 Next.js - getRequestHandler 和渲染函数之间的区别

标签 javascript node.js next.js

再会,

我很惊讶在 getRequestHandler 上找不到任何信息。和 render next 的功能包裹。

我正在尝试设置自定义服务器,但想知道 render 是什么?函数实际上是在做什么,或者为什么它甚至被使用? getRequestHandler清楚地呈现应用程序,那么我为什么要使用 render 手动传递路径?另外,分别传入路径名和查询有什么意义?

对于这两个的用例,我显然很困惑——在哪种情况下我会使用其中一个?

谢谢大家的帮助。

阿纳尼

https://nextjs.org/docs/advanced-features/custom-server

const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare().then(() => {
  createServer((req, res) => {
    // Be sure to pass `true` as the second argument to `url.parse`.
    // This tells it to parse the query portion of the URL.
    const parsedUrl = parse(req.url, true)
    const { pathname, query } = parsedUrl

    if (pathname === '/a') {
      app.render(req, res, '/b', query)
    } else if (pathname === '/b') {
      app.render(req, res, '/a', query)
    } else {
      handle(req, res, parsedUrl)
    }
  }).listen(3000, err => {
    if (err) throw err
    console.log('> Ready on http://localhost:3000')
  })
})

最佳答案

getRequestHandler 与渲染 app.getRequestHandler返回一个请求处理程序,我们可以使用它来解析所有 HTTP 请求。 app.render检查是否需要提供静态 Assets 。它还检查请求的页面是否是被阻止/内部页面。在这些检查通过后,Next.js 也使用我们将从 app.getRequestHandler 获得的相同请求处理程序。 .如果我们直接使用请求处理程序,我们将不会得到这些检查并遇到我们需要手动处理的问题。
以下是处理自定义服务器的部分源代码。我希望它使答案更清楚一点。

// next/next-server/server/next-server.ts
// This function expose a private method, which used by render 
public getRequestHandler() {
  return this.handleRequest.bind(this)
}

// render method
public async render() {
  // .... more code
  // check if server needs to handle static files
  if (
    !query._nextDataReq &&
    (url.match(/^\/_next\//) ||
      (this.hasStaticDir && url.match(/^\/static\//)))
  ) {
    return this.handleRequest(req, res, parsedUrl)
  }
  // check the requested page is a internal/blocked page
  if (isBlockedPage(pathname)) {
    return this.render404(req, res, parsedUrl)
  }

  const html = await this.renderToHTML(req, res, pathname, query)
  // Request was ended by the user
  if (html === null) {
    return
  }

  // respond with rendered HTML
  return this.sendHTML(req, res, html)

}
路径与查询
我认为 Next.js query与 URL 查询字符串有点不同。你可以有这样的路线'/a'并传入一个查询对象,而不将这些查询添加到您的 URL。
这是我回答这个问题的最大努力。希望我能提供一些帮助。
引用:
https://github.com/vercel/next.js/blob/canary/packages/next/next-server/server/next-server.ts

关于javascript - 自定义 Next.js - getRequestHandler 和渲染函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971672/

相关文章:

javascript - 尽管有固定值,SVG 中的文本元素仍能完美定位自身

javascript - 使一个 Controller 依赖于另一个 Controller 的范围

javascript - 如何更换 child 的 Prop ?

reactjs - 具有样式组件快速刷新的 NextJS 不起作用

javascript - 如何使用 next-auth 获取额外的范围数据?

javascript - 如何使用嵌套协程和 Promise 来简化 JS 代码?

javascript - 无法读取未定义的属性 'use_env_variable'

node.js - 如何使用模型模式创建环回远程方法?

node.js - 使用docker-compose的 Mongoose 连接失败

javascript - 在 React 中将函数组件转换为类组件