每个应用程序与用户有1对1的关系。 每个旅程都有n个应用程序 下面是我的以下代码,用于在所有旅程的应用程序中填充所有用户(学生)数据: view.on('init', function(next) { Trip.model.find() .exec(function(err, trips){ keystone.populateRelated(trips, 'students[user]', function(err) { locals.trips = trips; next(); }); }); }); 这是Trips与应用程序(StudentApp)的关系: Trip.relationship({ ref: 'StudentApp', refPath: 'finalTrip', path: 'students' }); 现在在前端,我可以打印一个用户的string化的JSON就好了: each trip in trips each app in trip.students p=app.user 然而,当我尝试访问一个字段,例如app.user._id我得到以下错误: Cannot read property '_id' of undefined 我感觉这是一个asynchronous的问题,但我不能为了我的生活找出如何解决这个问题。 帮助将不胜感激。 谢谢。
比方说,我有一个函数内的以下function: function (arr){ newArray = []; arr.forEach(function(prop){ //extract data from arr into newArray with newArray.push(), //this is done through fs and ffmpeg events } console.log(newArray); //empty, because of async problems //I want to proceed with my code here } 现在你可以看到,我从一个旧数组中提取数据到一个新数组中,每个newArray.push都是通过一个包含fs和FFmpeg等包的事件完成的,只有当你没有任何东西时才会运行问题是,由于JS内核同步运行,console.log(newArray); 是空的,我看不到所有的新值。 我只是想继续我的代码后为每个事件完成,而不是之前。 那么,我该如何解决这个问题呢? asynchronous包可能会有所帮助?
我正在尝试执行一个asynchronous数据库查找其中每个项目在数组中查找和它的价值总和。 现在我有下面的代码,只要main函数与数据库查找位于同一个文件中就行: // async is the async.js library // Products is a mongoose Schema var user = { cart: [11, 22, 33], orderCost = 0; } function getTotal (user, callback) { async.each(user.cart, findProduct, function (err) { if (err) { throw err; } callback(user); }); } function findProduct (skunumber, callback) { Products.findOne({sku: skunumber}, function (err, product) […]
我正在写一个能够获得selenium的类,并将这个值存储在类中。 它公开了一个使用类中获得的会话来获取selenium节点的方法。 但是,当JavaScript类调用我的新类getSeleniumNode返回未定义。 我敢肯定,这是因为getSeleniumNode不等待Web请求完成处理,但我不知道如何重新devise它的工作 var base = require(__paths.e2e.pages + '/base'), urlParse = require('url-parse'), request = require('sync-request'); module.exports = function (options) { var self = base(options); browser.getProcessedConfig().then(function (config) { self.seleniumHub = new urlParse(config.seleniumAddress); console.log(self.seleniumHub.host); browser.driver.getCapabilities().then(function (capabilities) { self.capabilities = capabilities; }); }); self.getSessionId = function () { return self.capabilities.caps_[ 'webdriver.remote.sessionid']; }; self.getPlatform = function () { […]
我很容易用fs.readFileSync完成这个工作,但是我想这样做是asynchronous的。 我的代码如下。 function send(err, str){ if(err){ console.log(err); } var template = ejs.render(str, 'utf8', {name: data.name}); transporter.sendMail({ from: myEmail, to: anotherEmail, subject: mySubject, html: template, attachments: images }, function(err, response) { if(err){ console.log(err); } }); } fs.readFile('emailTemplate.ejs', send); 所以我为fs.readFile做了我自己的callback,这样当文件被读取后,它将呈现电子邮件,把正确的名称放入然后用nodemailer发送出去。 但是,它不喜欢这个。 如果没有问题,它会得到错误,但是当渲染模板时呈现下列错误。 TypeError:Object(跟在模板的整个HTML之后)在导出时在Object.exports.parse(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:144:21)处没有方法“indexOf”。编译(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:229:15)在Object.exports.render(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:289:10 )在fs.readFile(fs.js:272:14)上发送(/home/ubuntu/workspace/routes/email.js:171:28)在Object.oncomplete(fs.js:108:15) 这样做虽然同步工作正常。 var str = fs.readFileSync('emailTemplate.ejs', 'utf8'); var template = ejs.render(str, { name: data.name […]
我想在我的服务中使用async.series([]),然后将结果返回给Controller。 但是,似乎async.series的可选callback函数并没有等到任务完成才返回到控制器。 /* In Services */ getFunction: function(userInput, callback) { var results = {}; async.series([ //1: This function get a list JSON dataset of id and other attributes function(callback) { //Call a function to call API by using the userInput, return function(error, JSONdataset1) //If error, return callback(error) //Else results = JSON.parse(dataset1); callback(null, JSON.stringify(results)); }, //2: […]
我以连续的方式(每天多次请求一次)抓取网站,并且每次都使用asynchronous和请求节点模块。 我使用async eachLimit并行运行函数getPage(这里没有显示代码)。 但是,一旦在几千个查询中,我收到以下错误: Error: getaddrinfo ENOTFOUND 247sports.com 247sports.com:80 at errnoException (dns.js:26:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:77:26) 即使我知道我通过它的url是有效的。 我发现有人使用http模块的解决scheme,并得到相同的错误,但似乎没有人使用请求模块得到这个。 我知道我的IP没有被阻止,因为我可以在错误之后立即访问网站。 我也知道我的用户代理不是问题,因为我旋转了用户代理列表,所有这些都是有效的。 我的猜测是问题在于请求库与节点http模块交互的地方。 不幸的是,我无法准确地重现问题,因为当我同时或连续推送大量请求时,它似乎只是被触发。 下面的函数代码是我的函数的样子: function getPage(){ var options = { url: "http://stackoverflow.com/", headers: { 'User-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110506 Firefox/4.0.1' }; request(options, function(err, resp, body) { if (err){ throw err; return; } PagesScraped++; […]
我有一个执行数据库查询的sequelize实例方法: getPropertyDays() { const queryString = ` SELECT state FROM property_days WHERE DATE(day) = CURDATE() AND property_id = :propertyId;`; const replacements = {propertyId: this.id}; return this.sequelize.query(queryString, {replacements: replacements, type: sequelize.QueryTypes.SELECT}); }, 被getter调用: getterMethods: { propertyState() { var self = this; const blockedDay = 'x'; const unavailableDay = 'u'; this.getPropertyDays().then(function(result) { var state = result[0]['state']; if […]
我的应用代码: const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); async function init() { while (true) { console.log("TICK"); await (rl.question('What do you think of Node.js? ', await (answer) => { console.log('Thank you for your valuable feedback:', answer); rl.close(); })) await new Promise(resolve => setTimeout(resolve, 1000)) } } 它如何工作(或我认为应该如何工作): 当我们遇见await (rl.question('…它应该等待响应(用户input)并且只有循环继续。 它是如何工作的 […]
我的例子是一个简单的HTTP服务器: http.createServer((req, res) => { if(req.method === `GET`){ if(req.headers.cookie === undefined){ let x = 1 let y = 2 let z = 30 } else{ let x = 10 let y = 20 let z = 3 } switch(req.url){ case `/`: // >>>> I need the appropriate variables here for the same client <<<< break […]