繁体   English   中英

Koa / Node.js-在一个控制器功能中使用多个模型

[英]Koa/Node.js - Use multiple models within one controller function

我试图使用Mongoose Schema从前端(内置于React中)的发布请求中创建一个新的“ Vault”。

当我在应用程序中点击“创建”按钮时,“发布请求”会启动,但会返回:

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); ,但我无法映射未定义的对象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会传递相同的数据,即使一切看起来相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM