我正在尝试将路由代码与数据库代码分开,但是当路由调用控制器方法时,我陷入了错误。
我有 productRoutes.js :
router.route('/')
.get(async (req, res, next) => {
try {
let criteria = {};
for (const el in req.query) {
criteria[el] = req.query[el];
}
console.log('Getting all products', criteria);
const result = await controller.getAll(criteria);
console.log('router result:', result);
const status = (result.ok ? (result.count > 0 ? 200 : 404 ) : 400);
return res.status(status).send(result);
} catch (err) {
return next(err);
}
});
productController.js :
exports.getAll = (criteria) => {
model.find(criteria, '-__v').exec((err, records) => {
const ok = (err ? false : true);
let result = {}
result.ok = ok;
if (ok) {
result.data = records;
result.count = records.length;
} else {
result.count = 0;
result.err = err;
}
console.log('controller result count:', result.count);
return result;
});
}
执行时会产生以下内容:
Getting all products {}
router result: undefined
TypeError: Cannot read property 'ok' of undefined
at router.route.post.get (C:\dev\projects\mercante\server\routes\productRoutes.js:58:36)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
controller result count: 4
执行不等待controller.getAll(criteria)
。
我尝试了一些发现类似问题的代码,例如try / catch async call,但是没有用,或者我错过了一些细节。
谢谢。
答案 0 :(得分:0)
原因:您控制器的exports.getAll = async (criteria) => {
// Return value!
return await model.find(criteria, '-__v');
}
方法未返回任何值。
您应该这样做:
from("direct:myRoute1")
.bean(new DemoRoute(), "test(Demo,xxx)")
.end();
from("direct:myRoute2")
.bean(new DemoRoute(), "test(Demo,xxx)")
.end();
public interface Shape
@Component
class Circle implements Shape{
}
@Component
class Square implements Shape{}
答案 1 :(得分:0)
谢谢,@ Rashad。现在可以使用了:
productController.js :
exports.getAll = async (criteria) => {
return await model.find(criteria, '-__v');
}
productRoutes.js :
.get(async (req, res, next) => {
try {
let criteria = {};
for (const el in req.query) {
criteria[el] = req.query[el];
}
console.log('Getting all products', criteria);
let result = {};
const data = await controller.getAll(criteria);
result.count = data.length;
result.data = data;
const status = (result.ok ? (result.count > 0 ? 200 : 404 ) : 400);
return res.status(status).send(result);
} catch (err) {
return next(err);
}
});