执行mongodb请求后如何将响应发送到前端?

时间:2018-07-29 17:54:18

标签: node.js mongodb

我正在创建注册页面。在哪里,我首先检查用户电子邮件是否已经存在于我们的mongodb数据库中。如果存在,那么我想将错误消息发送到frontEnd。但是,我未能做到这一点,我认为这可能是由于JavaScript的异步行为所致。我的代码如下:

var myObj , myJSON
var SignUpUserEmail, SignUpUserPassword, SignUpUserName, SignUpErr
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query 
  SignUpUserEmail = q.SignUpUserEmail
  SignUpUserPassword = q.SignUpUserPassword
  SignUpUserName = q.SignUpUserName

  MongoClient.connect("mongodb://localhost:27017/ABC",function(err, 
  database) {
    if (err) throw err;
    var db=database.db('ABC')

    let findOneParam = {"UserEmail":SignUpUserEmail} 
    db.collection('Profiles').findOne(findOneParam, function(err, result) {
    if (err) throw err;
    if(!result) {
      db.collection('Profiles', function(err, collection){
        if (err) throw err;
        collection.insertOne({"UserId":"ProfileA0001",
                          "UserEmail":SignUpUserEmail,
                          "UserPassword":SignUpUserPassword,
                          "UserName":SignUpUserName,
                          "IsEmailAuthenticated":"false"
                        }, function(err, res){
          if (err) throw err;
          SignUpErr = "document inserted"
          console.log("SignUpErr inside:", SignUpErr)
        })
      })
    } else {
      SignUpErr = "Email already has been registered."
      console.log("SignUpErr inside:", SignUpErr)
    }
  })
})

  console.log("SignUpErr outside:", SignUpErr)
  myObj = {"SignUpErr":SignUpErr};
  myJSON = JSON.stringify(myObj);
  res.end(myJSON);
}).listen(9000);

注意:“ SignUpErr内部:”给出正确的结果。但是,“ SignUpErr outside:”将其显示为未定义。

2 个答案:

答案 0 :(得分:1)

  

注意:“ SignUpErr内部:”给出正确的结果。但是,“ SignUpErr outside:”将其显示为未定义。

这是由于nodejs的异步特性。 SignUpErr将一直undefined直到在db.collection('Profiles',function(){})调用中被初始化为止。

因此,要解决此问题,您需要在db.collection('Profiles',function(){})内发送响应。即是在初始化之后。

对代码进行更改,

'use strict';

const http = require('http');

http.createServer(function (req, res) {

  res.statusCode = 200; // Setting the status code
  res.setHeader('Content-Type', 'text/plain');  // Setting the content-type for response

  let {SignUpUserEmail, SignUpUserPassword, SignUpUserName} = url.parse(req.url, true).query;

  MongoClient.connect("mongodb://localhost:27017/ABC", function (err, database) {
    if (err) {
      throw err;
    }

    let db = database.db('ABC');

    db.collection('Profiles').findOne({
      UserEmail: SignUpUserEmail
    }, function (err, result) {
      if (err) {
        throw err
      }

      if (result) {
        let msg = "Email already has been registered.";
        console.log("SignUpErr inside:", msg);

        return res.end(JSON.stringify({
          SignUpErr: "document inserted"
        }));
      }

      db.collection('Profiles', function (err, collection) {
        if (err) throw err;
        collection.insertOne({
          "UserId": "ProfileA0001",
          "UserEmail": SignUpUserEmail,
          "UserPassword": SignUpUserPassword,
          "UserName": SignUpUserName,
          "IsEmailAuthenticated": "false"
        }, function (err, dbresult) {
          if (err) {
            throw err;
          }
          let msg = "document inserted";
          console.log("SignUpErr inside:", msg);

          return res.end(JSON.stringify({
            SignUpErr: "document inserted"
          }));

        })
      });

    });
  });

}).listen(9000);

答案 1 :(得分:0)

我通常使用express作为随res.send()方法附带的Web框架,您可以在其中发送响应。我通常会构建一个JSON响应,并将其作为res.send(JSON.stringify(data));发送;还有res.JSON(data)。 如果您希望使用HTTP模块,则可以使用res.end()方法。 提供了详细信息here。希望这会有所帮助。