Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点JS异步/等待控制器问题_Javascript_Node.js_Express_Async Await - Fatal编程技术网

Javascript 节点JS异步/等待控制器问题

Javascript 节点JS异步/等待控制器问题,javascript,node.js,express,async-await,Javascript,Node.js,Express,Async Await,我试图在我的节点API控制器中使用异步函数,但收到来自“错误处理程序”中间件的错误 TypeError:fn不是一个函数 评估时webpack:///./app/middleware/errorHandler.js?:16:21 它不喜欢从控制器导出的“findAll”函数,为什么这不是一个函数?我是否正确导出函数?我是否正确使用async/Wait?我需要一个填充胶吗?我知道节点v8支持异步/等待。我目前正在运行Node v11.10和Express v4.16.4 这是我的路由文件: //

我试图在我的节点API控制器中使用异步函数,但收到来自“错误处理程序”中间件的错误

TypeError:fn不是一个函数 评估时webpack:///./app/middleware/errorHandler.js?:16:21

它不喜欢从控制器导出的“findAll”函数,为什么这不是一个函数?我是否正确导出函数?我是否正确使用async/Wait?我需要一个填充胶吗?我知道节点v8支持异步/等待。我目前正在运行Node v11.10和Express v4.16.4

这是我的路由文件:

// routes.js
const verifyToken = require('../../middleware/verifyToken.js');
const errorHandler = require('../../middleware/errorHandler.js');

module.exports = app => {
    const controller = require('../../controllers/controller.js');

    app.get(`/collection`, verifyToken, errorHandler(controller.findAll));
}
这是我的控制器:

// controller.js
exports.findAll = async (req, res) => {
    const collections = await collection.find().populate('other');
    res.send(collections);
};
这是我的中间件:

// errorHandler.js
module.exports = fn => {
  return (req, res, next) => {
    Promise.resolve(fn(req, res, next)).catch(next);
  };
};

非常感谢您的帮助。

如果我正确理解您的意思,我相信我会这样做:

// routes.js
const verifyToken = require('../../middleware/verifyToken.js');
const controller = require('../../controllers/controller.js');

module.exports = app => {
  app.get(`/collection`, verifyToken, controller.findAll);
}

我不确定,但errorHandler是否希望fn是错误?如果是这样,为什么它被称为passing req,res next

我使用以下结构:

路由器

// routes.js
const verifyToken = require('../../middleware/verifyToken.js');
const controller = require('../../controllers/controller.js');

var router = express.Router()

router.route('/collection').get(
  verifyToken,
  controller.findAll
)
module.exports = router
控制器

// controller.js
const asyncUtil = fn =>
  function asyncUtilWrap(req, res, next, ...args) {
    const fnReturn = fn(req, res, next, ...args)
    return Promise.resolve(fnReturn).catch(next)
  }

module.exports = {
    findAll: asyncUtil(async (req, res, next) => {
        const collections = await collection.find().populate('other'); // you can do try/catch here if you want to handle the error here
        res.send(collections);
};
然后错误处理程序通常位于app.js的底部,但您可以将其放置在路由器的底部:

// app.js 
app.use(function(err, req, res, next) {
  res.status(err.status || 500)
  res.send(err.message)
})

我需要一个填充胶吗?没有,我想知道你为什么会收到一个网页错误。错误处理程序是函数而不是承诺。带大写字母的VerifyToken也是打字错误吗?您似乎在寻找VerifyToken.findAll。你的routes.js文件中没有变量findAll。很抱歉,我已经更新了我的问题以更正错误。谢谢你的回答,我在我的控制器函数中实现了try/catch,但现在我收到以下错误:错误:Route.get需要回调函数,但得到了一个[object Undefined]@Dale不确定,没有看到更多代码,但这听起来像是你传递给一条路线的中间产品之一是未定义的。你还在做findAll而不是controller.findAll吗?不,我没有,这似乎是我的controller导出的问题。当我在路由文件中输入console.log controller时,我无法定义您是否可以在文件顶部或函数内部执行要求?我对后者有意见,我认为这是一种不好的做法,我两种都试过了,两种都没用。我同意它在函数内部的错误做法,我正在用babel编译我的app.js,如果我使用export const findAll而不是module.exports={}这似乎有效。谢谢你的回答,用这种方式处理错误比我的方法更干净。但我收到的错误与@Kenmore的解决方案相同
// app.js 
app.use(function(err, req, res, next) {
  res.status(err.status || 500)
  res.send(err.message)
})