Javascript Custom Next.js-getRequestHandler和render函数之间的差异

Javascript Custom Next.js-getRequestHandler和render函数之间的差异,javascript,node.js,next.js,Javascript,Node.js,Next.js,你好 我很惊讶,我找不到关于next包的getRequestHandler和render函数的任何信息 我正在尝试设置一个自定义服务器,我想知道render函数实际上在做什么,或者为什么要使用它getRequestHandler清楚地呈现了应用程序,那么我为什么要使用render手动传递路径呢?另外,分别传入路径名和查询有什么意义 对于这两个用例,我显然感到困惑——在哪种情况下我会使用其中一个 谢谢大家的帮助 阿纳尼 看 getRequestHandler vs render app.getRe

你好

我很惊讶,我找不到关于
next
包的
getRequestHandler
render
函数的任何信息

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

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

谢谢大家的帮助

阿纳尼


getRequestHandler vs render

app.getRequestHandler
返回一个可以用来解析所有HTTP请求的请求处理程序<代码>应用程序渲染检查静态资产是否需要服务。它还检查请求的页面是否为阻止/内部页面。在这些检查通过后,Next.js还使用我们将从
app.getRequestHandler
获得的相同请求处理程序。如果我们直接使用请求处理程序,我们将不会得到这些检查,并遇到需要手动处理的问题

下面是处理自定义服务器的部分源代码。我希望这能让答案更清楚一点

//next/next server/server/next-server.ts
//此函数公开一个私有方法,render使用该方法
公共getRequestHandler(){
返回this.handleRequest.bind(this)
}
//渲染方法
公共异步呈现(){
//……更多代码
//检查服务器是否需要处理静态文件
如果(
!query.\u下一个数据请求&&
(url.match(/^\/\u next\//)||
(this.hasStaticDir&&url.match(/^\/static\/))
) {
返回此.handleRequest(req、res、parsedUrl)
}
//检查请求的页面是否为内部/阻止页面
如果(isBlockedPage(路径名)){
返回此.render404(req、res、parsedUrl)
}
const html=wait this.renderToHTML(req、res、路径名、查询)
//用户已结束请求
如果(html==null){
返回
}
//用呈现的HTML响应
返回此.sendHTML(req、res、html)
}
路径和查询

我认为Next.js
query
与URL查询字符串有点不同。您可以有这样一个路由
'/a'
,并传入查询对象,而无需将这些查询添加到URL

这是我最大的努力来回答这个问题。希望我能提供一些帮助

参考资料:

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')
  })
})