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