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 - 在一个控制器功能中使用多个模型的主要内容,如果未能解决你的问题,请参考以下文章

基于 Koa平台Node.js开发的KoaHub.js获取/设置会话功能代码

如何评价 Node.js 的koa框架

最新Node.js框架:Koa 2 实用入门

深入node.js koa原理,实现koa

深入node.js koa原理,实现koa

node.js Koa 框架 的中间件用法