Koa / Node.js - 在一个控制器功能中使用多个模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Koa / Node.js - 在一个控制器功能中使用多个模型相关的知识,希望对你有一定的参考价值。
我试图使用Mongoose Schema从我的前端(内置React)的Post Request创建一个新的'Vault'。
当我点击我的应用程序中的创建按钮时,Post Request会启动,但会返回:
POST http://localhost:3000/vaults/create 500 (Internal Server Error)
当我的控制器功能createVault()启动时,它将从模型中成功创建一个“Vault”(见下文):
//Create a vault
module.exports.createVault = async (ctx, next) => {
if ('POST' != ctx.method) return await next();
try {
if (!ctx.request.body.name) {
ctx.status = 404
}
//Create new vault
const vault = await Vault.create({
name: ctx.request.body.name,
url: ctx.request.body.url,
description: ctx.request.body.description
});
await vault.save();
//Return vault
ctx.body = vault;
ctx.status = 201;
}
catch (error) {
if (error) {
console.log('Error in the createVault controller:', error);
ctx.status = error.response.status;
ctx.body = error.response.data;
}
}
}
但是,当我尝试添加第二个Schema模型时,会出现问题;我试图从ctx.request.body.crypts数组中的每个项目创建一个“地穴”(见下文):
//Create a vault
module.exports.createVault = async (ctx, next) => {
if ('POST' != ctx.method) return await next();
try {
if (!ctx.request.body.name) {
ctx.status = 404
}
//Create new vault
const vault = await Vault.create({
name: ctx.request.body.name,
url: ctx.request.body.url,
description: ctx.request.body.description
});
//Create new crypts
const promises = await ctx.request.body.crypts.map(crypt => Crypt.create({
name: crypt
}));
//Add reference to vault
const crypts = await Promise.all(promises);
vault.crypts = crypts.map(crypt => crypt._id);
await vault.save();
//Return vault and crypts
ctx.body = [vault, crypts];
ctx.status = 201;
}
catch (error) {
if (error) {
console.log('Error in the createVault controller:', error);
ctx.status = error.response.status;
ctx.body = error.response.data;
}
}
};
我收到的错误说我无法映射未定义的对象,虽然我使用的是const crypts = await Promise.all(promises);
任何人都可以建议一个正确的解决方法吗?非常感谢。
答案
我设法通过创建一个名为cleanBody(body)的函数来解决我的问题,该函数手动解析数据供我使用。
我记录了返回字符串的typeof ctx.request.body
并显示了我的问题。 cleanBody(body)函数只是检查body是否是一个对象,然后使用JSON.parse()如果它是一个字符串(见下文):
const cleanBody = body => {
return typeof body !== 'object' ? JSON.parse(body) : body;
};
我的错误是假设Postman中的API和应用程序中调用的API会传递相同的数据,即使所有内容看起来都相同
以上是关于Koa / Node.js - 在一个控制器功能中使用多个模型的主要内容,如果未能解决你的问题,请参考以下文章