【问题标题】:NodeJS - Controller not returning JSON to RouteNodeJS - 控制器没有将 JSON 返回到路由
【发布时间】:2020-08-05 21:31:17
【问题描述】:

所以我创建了一个控制器来创建用户配置文件,一切正常,它在数据库中创建它,但我无法得到任何响应......起初我以为这是我的路线,但经过一些通过在控制器中的方法早期添加测试响应进行测试,它返回正常。我不确定我错过了什么,就像我说它进入数据库一样。

这是我的 Controller.js

module.exports = function(req, res) {
  var mod = {
     createMerchantUser(req, res) {
       var merchantDescription = 'Merchant for ' + req.body.email;

       ////////// If I add a test Response HERE it returns perfectly
       /////////  return{ message: "Testing response here..." }


     // ANYTHING BELOW GETS CREATED IN DATABASE BUT DOESN'T PROVIDE A RESPONSE
       var merchant = stripe.customers.create({
         email: req.body.email,
         description: merchantDescription
       }, function(err, customer) {

         var new_merchant_user = new MerchantUser({
           email: req.body.email,
           password: req.body.password,
           accountConfirmed: false,
           stripeID: customer.id
         });

        new_merchant_user.save(function(err, merchantUser) {

           if (err) {
             if (err.name === 'MongoError' && err.code === 11000) {
             // Duplicate username
                return res.status(500).send({ success: false, message: 'An account with this email already exists!' });
             }
           }

           res.json({
             data: {
               merchantUser
             }
           });
         });
       });
     }
   }
   return mod;
};

这是我的 Route.js

  app.post('/api/createMerchUser', (req, res) => {
    return res.json(merchantUsersController.createMerchantUser(req, res))
  })

更新:

只是为了更多的上下文。下面是我以前做的不同方式,它会很好用。它在创建对象后返回它。这样做的问题是我不能在不同的控制器中调用方法,因此我不得不使用上面的方法......

Controller.js


exports.create_merchant_user = function(req, res) {
  var merchantDescription = 'Merchant for ' + req.body.email;

  var merchant = stripe.customers.create({
    email: req.body.email,
    description: merchantDescription
  }, function(err, customer) {

    var new_merchant_user = new MerchantUser({
       email: req.body.email,
       password: req.body.password,
       accountConfirmed: false,
       stripeID: customer.id
    });

    new_merchant_user.save(function(err, merchantUser) {

      if (err) {
        if (err.name === 'MongoError' && err.code === 11000) {
        // Duplicate username
            return res.status(500).send({ success: false, message: 'An account with this email already exists!' });
        }
      }

      res.json({
        data: {
          merchantUser
        }
      });
    });
  });

};

Route.js

  app.route('/api/merchantUser')
    .post(merchantUsers.create_merchant_user);

【问题讨论】:

  • 您是否尝试过在控制器中进行控制台日志记录 merchantUser
  • 是的,一切正常,对象进入数据库 - 我得到 200,所以保存功能没有问题,它是响应。

标签: node.js mongodb rest mongoose


【解决方案1】:

您没有将数据返回到控制器中的路由。 使用return 关键字。

 return res.json({
             data: {
               new_merchant_user
             }
           });

【讨论】:

  • 不幸的是结果相同,它写入数据库但没有响应。
  • 尝试在save函数之外返回响应。可能会有所帮助
  • 不幸的是,在外面做也无济于事
  • 需要在保存函数外返回new_merchant_user对象。因为它实际上保存了数据。试试这个。
  • 是的,这每次都会返回对象,但即使发生错误也会返回它,因此它不会产生预期的结果。如果您看到我更新的问题并了解我的旧方法是如何工作的。我的新方法应该产生所需的输出,但没有。
【解决方案2】:

您是否收到 304 状态码?

如果是,那么,

304 Not Modified 响应代码表示请求的资源 自上次传输以来未修改。这通常 意味着不需要将请求的资源重新传输到 客户端,并且可以使用缓存版本。

尝试在发出获取请求时更改您的数据,然后查看您是否获得响应数据。

【讨论】:

  • 我再次检查了您的代码,您的数据库是否在 API 调用后添加了行?如果是,那么返回 [] 是完全正常的,因为这是一个 .save() 函数。
  • 但是我需要它来返回对象以便我可以使用它?
  • 然后你需要在你的 .save 中进行另一个 .find 查询。 { email: req.body.email, password: req.body.password, accountConfirmed: false, stripeID: customer.id } 您可以使用对象中的任何唯一值来查找。
  • 如果您查看我更新的问题,它会以旧方式返回对象。不需要 find ,所以我不确定为什么现在需要它?
【解决方案3】:

试试下面的代码:

return res.status(200).type('application/json').send({
                    "statusCode": 200,
                    "statusMsg": "success, 
                    "data": merchantUser
                });

【讨论】:

  • 不幸的是,这无济于事。
  • 如果你愿意,你可以指定你的路由如下: app.post('/api/createMerchUser', MerchantUserController.createMerchantUsers) 然后在你的控制器文件中你可以使用上面的 res.send()代码
  • 它仍然没有返回 JSON...似乎是 .create 或 .save 调用中的一个问题,因为在这些工作之外完美返回。
【解决方案4】:

尝试添加一个 else 块


if (err) {
    if (err.name === 'MongoError' && err.code === 11000) {
        // Duplicate username
        return res.status(500).send({ success: false, message: 'An account with this email already exists!' });
    }
} else {

    return res.json({
        data: {
            merchantUser
        }
}




【讨论】:

  • 我尝试了这个以及上面的答案,不幸的是结果相同,它写入数据库但没有响应。
  • 在`res.json({ data: {businessUser}`之前尝试控制台记录merchantUser
  • merchantUser 对象就在那里。即使添加了return,仍然没有响应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多