node.js - Mongoose 在保存之前更新模型

标签 node.js mongodb mongoose

我有一个模型:

const wordSchema = mongoose.Schema({
  author: {type: Object, default: 'unknown'},
  quote: String,
  source: {type: String, default: 'unknown', index: true},
  rating: {type: Number, default: 0},
  createdAt: {type: Date, default: Date.now},
  updatedAt: {type: Date, default: Date.now},
});

现在,在收到对我的服务器的 POST 请求后,我想向维基百科发出 GET 请求,并获取作者信息,然后将其作为对象附加到我的模型中,并将该模型写入我的数据库中。

app.post('/', function(req, res) {
  let author = {};
  let quote = new Word({
    author: req.body.author,
    quote: req.body.quote,
    source: req.body.source,
    rating: req.body.rating,
  });
  let authorName = req.body.author.replace(/ /g, '%20');
  let url = 'https://en.wikipedia.org/w/api.php?action=query&format=json&titles=' + authorName + '&prop=pageimages|extracts&pithumbsize=200&exsentences=10&exintro=true';
  request.get(url, (error, response, body) => {
    if(error) {
      return error;
    }
    let data = JSON.parse(body);
    let pageID;
    for(page in data.query.pages) {
      pageID = page;
    }
    author = {
      name: req.body.author,
      thumbnail: data.query.pages[pageID].thumbnail.source,
      flavorText: data.query.pages[pageID].extract,
    };
  });
  // Save the quote
  quote.pre('save', (next) => {
    this.author = author;
  })
  quote.save(function(err, quote) {
    if (err) {
      res.send(err);
    }
    res.redirect('/words');
  });
});

现在我尝试使用 .pre 函数更新值,但我得到了

quote.pre is not a function

“这样做的正确方法是什么?我做错了什么?”

最佳答案

quote 不是 Mongoose 架构,但 wordSchema 是,因此需要如下所示:

wordSchema.pre('save', (next) => {
  this.quote = whteverYouWantToAssignWith;
})

但实际上,据我了解,您的用例中并不需要它,您可以按如下方式实现您想要的:

app.post('/', function(req, res) {
  let authorName = req.body.author.replace(/ /g, '%20');
  let url = 'https://en.wikipedia.org/w/api.php?action=query&format=json&titles=' + authorName + '&prop=pageimages|extracts&pithumbsize=200&exsentences=10&exintro=true';
  request.get(url, (error, response, body) => {
    if(error) {
      return error;
    }
    let data = JSON.parse(body);
    let pageID;
    for(page in data.query.pages) {
      pageID = page;
    }

    let quote = new Word({
      author: {
        name: req.body.author,
        thumbnail: data.query.pages[pageID].thumbnail.source,
        flavorText: data.query.pages[pageID].extract,
      },
      quote: req.body.quote,
      source: req.body.source,
      rating: req.body.rating,
    });

    quote.save(function(err, quote) {
      if (err) {
        res.send(err);
      }
      res.redirect('/words');
    });
  });
});

关于node.js - Mongoose 在保存之前更新模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40889415/

相关文章:

c# - 如何通过聚合从 mongo 集合中过滤 datetime.Month ?

mongodb - 什么是多态数据? NoSQL 数据库

node.js - 在大型 Mongo 集合中,如何使用 mongoose 仅​​检索 ID(或任何其他特定属性)?

javascript - 返回 Mongodb 查询 Distinct

javascript - 缺少架构错误 : Schema hasn't been registered for model “Marker”

node.js - 插入对象mongodb的私有(private)变量

node.js - Jasmine 试 Bamboo ?

node.js - 用于将两个 Node.js 服务器映射到同一台机器上的相同地址的 nginx 配置

即使 console.log() 打印正确的值,javascript Protractor 函数在从 cucumber 步骤定义调用时返回未定义

javascript - Mongodb 查询 ObjectID 返回 null