【问题标题】:Executing res.render asynchronously in express app在 express 应用程序中异步执行 res.render
【发布时间】:2016-07-16 21:31:54
【问题描述】:

我尝试让这个路由器响应异步:

var express = require('express'),
    router  = express.Router();

router.get('/', function(req, res, next) {
  res.render('contact', {
    titleShown: true,
    title: 'Contact'
  });
});

我尝试实现async,我读到过关于here,但没有工作:

var express = require('express'),
    router  = express.Router(),
    async   = require('async');

router.get('/', function(req, res, next) {
  async.parallel([
    res.render('contact', {
      titleShown: true,
      title: 'Contact'
    })
  ], req);
});

我该怎么做?

使用--trace-sync-io 标志时收到的错误消息:

WARNING: Detected use of sync API
    at fs.statSync (fs.js:892:18)
    at tryStat (C:\www\node\website\node_modules\express\lib\view.js:169:15)
    at resolve (C:\www\node\website\node_modules\express\lib\view.js:142:14)
    at lookup (C:\www\node\website\node_modules\express\lib\view.js:110:17)
    at View (C:\www\node\website\node_modules\express\lib\view.js:85:20)
    at render (C:\www\node\website\node_modules\express\lib\application.js:569:12)
    at render (C:\www\node\website\node_modules\express\lib\response.js:961:7)
    at C:\www\node\website\routes\contact.js:9:7
    at handle (C:\www\node\website\node_modules\express\lib\router\layer.js:95:5)

【问题讨论】:

  • 异步响应是什么意思?
  • contact.js 中的第 9 行第 9 列是 res.render,这就是为什么我认为它不是异步的。我用错误消息更新了我的问题。
  • res.render 已经是异步的。如果你这样做:router.get('/', (req, res, next) => { res.render('contact', {title: 'contact'}, (err, html) => { console.log('sent this static stuff'); }); console.log('this is async'); }); you can probably see what 'this is async' string can appear before 'sent this static stuff' because all this stuff is async.
  • 它是 express-handlebars 模板引擎。从错误消息看来,使用fs.statSyncfs.stat 的同步形式。为什么在这种情况下使用 fs.statSync 表达?
  • 将contact.js重命名为contact.hbs !!如果你仍然得到错误,那么问题在于你的联系内容

标签: javascript node.js express asynchronous router


【解决方案1】:

不,res.render 不是完全异步的(目前)。所以错误真的来自res.render

是的,res.render API 有同步部分(这很糟糕),但它 将在 Express 5.0 中解决,因为我们无法解决它 破坏视图引擎的兼容性。

使用 NODE_ENV=production 启动您的应用程序或设置 cache 为 true 以进行渲染只会导致文件系统活动 在启动时每次查看一次,这使得这不是问题,而 应用程序在生产中完全运行,因为没有同步文件系统 由于视图被缓存而被调用。

Source

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多