使用mongoose.js插入或更新到MongoDB

时间:2013-07-01 23:56:48

标签: node.js mongodb callback express mongoose

我正在开发一个包含node.jsexpress.jsMongoDBmongoose.js的REST API,并且发现这可以在app.put('/api/users/:userId',function(req, res) { });的回调中运行

  new User({ userId : requestData.userId}).findByUserId(function (err, users) {
    if (err) {
      response.status = 'Find Error';
      response.error = err;
      debug('ERROR: ', err);
      res.send(response);
    } else if (!users.length) {
      response.status = 'Registered a new user...';
      debug(response.status);
      var newUser = extend(new User({ userId : requestData.userId, created : Date.now() }), requestData);
      newUser.save(function (err, saveduser) {
        if (err) {
          response.status = 'Insert Error';
          response.error = err;
          debug('ERROR: ', err);
        } else {
          response.user = saveduser;
          debug('New user saved: ', saveduser);
        }
        res.send(response);
      });
    } else {
      response.status = 'Found registered user...';
      debug(response.status);
      if (users.length !== 1) {
        response.status = 'Multiple Users error';
        response.error = 'Found more than one user with userId: ' + requestData.userId;
        response.user = users;
        debug('ERROR: Duplicate entries for userId %s. Users are: ', requestData.userId, users);
        res.send(response);
      } else {
        var existingUser = users[0];
        existingUser.updated = Date.now();
        response.user = existingUser;
        existingUser.save(function (err, user) {
          if (err) {
            response.status = 'Insert Error';
            response.error = err;
            debug('ERROR: ', err);
          } else {
            response.user = user;
            debug('User updated: ', user);
          }
          res.send(response);
        });
      }
    }

我看过upsert选项,但无法真正了解它。

考虑到基于callback的模型和{{1},这肯定看起来不是正确的方法,我找不到任何关于如何以正确的方式做这样的事情的好文章在它的论点。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

我认为您不会更新现有用户或创建新用户的单一路线的概念是个好主意。相反,请考虑遵循REST设计:

app.post('/api/users', createNewUser);
app.put('/api/users/:userId', updateUser);

createNewUser应该只使用适当的属性创建一个新的用户对象,并在其上调用saveupdateUser可以User.update({_id: req.params.userId}, fieldsToChange...。看看你是否可以开始这项工作,并且不会添加诸如检查已注册用户的复杂性,直到简单的创建/更新对工作正常并且你有信心。然后,您可以将代码发展为更加强大和逼真,但需要一步一步地进行。