第7章 女神,我们做朋友吧 - nswbmw/N-drifter GitHub Wiki

捡到了女神的瓶子怎么办?当然要搭讪啦~ 接下来我们实现漂流瓶的聊天功能。

打开 app.js ,在 app.listen(3000); 前添加如下代码:

// 回复特定 id 的漂流瓶
// POST user=xxx&content=xxx[&time=xxx]
app.post('/reply/:_id', function (req, res) {
  if (!(req.body.user && req.body.content)) {
    return callback({code: 0, msg: "回复信息不完整!"});
  }
  mongodb.reply(req.params._id, req.body, function (result) {
    res.json(result);
  });
});

打开 mongodb.js ,在最后添加如下代码:

// 回复特定 id 的漂流瓶
exports.reply = function(_id, reply, callback) {
  reply.time = reply.time || Date.now();
  // 通过 id 找到要回复的漂流瓶
  bottleModel.findById(_id, function (err, _bottle) {
    if (err) {
      return callback({code: 0, msg: "回复漂流瓶失败..."});
    }
    var newBottle = {};
    newBottle.bottle = _bottle.bottle;
    newBottle.message = _bottle.message;
    // 如果捡瓶子的人第一次回复漂流瓶,则在 bottle 键添加漂流瓶主人
    // 如果已经回复过漂流瓶,则不再添加
    if (newBottle.bottle.length === 1) {
      newBottle.bottle.push(_bottle.message[0][0]);
    }
    // 在 message 键添加一条回复信息
    newBottle.message.push([reply.user, reply.time, reply.content]);
    // 更新数据库中该漂流瓶信息
    bottleModel.findByIdAndUpdate(_id, newBottle, function (err, bottle) {
      if (err) {
        return callback({code: 0, msg: "回复漂流瓶失败..."});
      }
      // 成功时返回更新后的漂流瓶信息
      callback({code: 1, msg: bottle});
    });
  });
};

我们先使用 mongoose 的 findById 找到特定的漂流瓶,修改后然后用 findByIdAndUpdate 更新,成功后返回更新后的文档。现在数据库中的文档由原来的(不包含 _id__v):

{
  bottle: ["$picker"],
  message: [
    ["$owner", "$time", "$content"]
  ]
}

变为了:

{
  bottle: ["$picker", "$owner"],
  message: [
    ["$owner", "$time", "$content"],
    ["$picker", "$time", "$content"],
    // ["$owner or $picker", "$time", "$content"],
    // ["$owner or $picker", "$time", "$content"],
    ...
  ]
}

注意: bottle 数组的第一项一定为捡瓶子的用户,第二项要是存在,一定为瓶子的主人。同理,message 数组第一项一定为漂流瓶原来的信息,第二项一定为捡到瓶子的人的初次回复信息。

现在,不只是捡到瓶子的人可以获取到该漂流瓶,扔瓶子的人也可以获取该漂流瓶了。也就是说,扔瓶人和捡瓶人都可以对该漂流瓶文档更新和读取,从而间接实现了聊天的功能。

接下来我们实现从 "我的瓶子" 中删除瓶子的功能。

打开 app.js ,在 app.listen(3000); 前添加如下代码:

// 删除特定 id 的漂流瓶
// GET /delete/529a8b5b39242c82417b43c3
app.get('/delete/:_id', function (req, res) {
  mongodb.delete(req.params._id, function (result) {
    res.json(result);
  });
});

打开 mongodb.js ,在最后添加如下代码:

// 删除特定 id 的漂流瓶
exports.delete = function(_id, callback) {
  // 通过 id 查找并删除漂流瓶
  bottleModel.findByIdAndRemove(_id, function (err) {
    if (err) {
      return callback({code: 0, msg: "删除漂流瓶失败..."});
    }
    callback({code: 1, msg: "删除成功!"});
  });
};

我们使用 mongoose 的 findByIdAndRemove 查找并删除特定 id 的漂流瓶。

注意:扔瓶人和捡瓶人都能删除他们共有的漂流瓶。

现在,我们完成了通过漂流瓶聊天的功能。