我正在尝试让我的nodejs控制器更新货币表中的费率。
在S3T / RoboMongo中一切正常,但由于某种原因,它只是不会在nodejs控制器中触发更新。
这是我的货币表
{
"_id" : "USD",
"index" : NumberInt(6),
"name" : "Dollar",
"currency" : "USD",
"symbol" : "$",
"active" : true,
"default" : false,
"rate" : 0
}
{
"_id" : "EUR",
"index" : NumberInt(2),
"name" : "Euro",
"currency" : "EUR",
"symbol" : "€",
"active" : true,
"default" : false,
"rate" : 0
}
我尝试了这两种方法,在S3T中工作正常但在nodejs中没有工作:
db.currency.update (
{ _id : "EUR" },
{ $set: { rate : 123 }},
{ upsert: true }
)
db.currency.updateOne (
{ _id : "EUR" },
{ $set: { rate : 123 }},
{ upsert: true }
)
这是我的nodejs代码:
var mongoose = require('mongoose');
var currencyModel = require('../models/currencyModel');
var currencyTable = mongoose.model('currencyModel');
var updateRates = () => {
return new Promise((resolve, reject) => {
for (var key in data.quotes) {
var currencyID = key.substring(3);
var newRate = (data.quotes[key] * THBUSD).toFixed(5);
console.log("currencyID: " + currencyID)
console.log("newRate: " + newRate)
currencyTable.update (
{ _id: currencyID },
{ $set: { rate : newRate }},
{ upsert: true }
),function (err, data) {
if (err) {
reject(new Error('updateRates: ' + err));
};
};
};
resolve();
})};
这是我的currencyModel(我觉得问题出在哪里?!?)
// Currency Model
// This model is the structure containing data from the Currency table
//
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var currencySchema = new Schema({
_id: String, // Unique Currency code
index: Number, // Indes for sorting
name: String, // Currency name
symbol: String, // Currency symbol
active: Boolean, // Active True False
rate: Number // Exchange rate (multiply with THB price)
});
module.exports = mongoose.model('currencyModel', currencySchema, 'currency');
我无法理解为什么它不会从nodejs内部触发currencyTable.update。
我在mongoose中启用了调试,我在控制台中看到了所有其他mongodb操作,如Mongoose: price.findOne({ _id: 'ATL-D406' }, { fields: {} })
等。但我在控制台中看不到这个currency.update
,这就是为什么我不这么认为它向mongodb发射 - 我看不出原因。
答案 0 :(得分:1)
你有一个"循环"在内部回调触发之前完成执行。相反,只需使用Promise并调用Promise.all()
来收集所有迭代的Promise并解决它们:
var updaterates = () => {
return Promise.all(
Object.keys(data.quotes).map(k => {
return currencyTable.update(
{ _id: k.substring(0,3) },
{ $set: { rate : (data.quotes[k] * THBUSD).toFixed(5) }},
{ upsert: true }
).exec()
});
)
};
Promise.all()
的返回响应是来自更新的响应对象的数组。另请注意,这是一个快速失败的问题"操作和通话将同时进行。
Object.keys()
返回一个"键名称数组"在指定的对象中。 .map()
迭代这些键并返回一个"数组"迭代器的return
值。
我们使用k
作为"键名"要从data.quotes
访问所需的密钥,并使用这些值与.update()
执行每个.exec()
,以返回"真实" Promise
。迭代器返回一个"数组" Promise
成为Promise.all()
的参数。