我怎样才能使用承诺来捕捉错误,当他们可能不被包装在一个承诺?

背景 我正在使用承诺,我有许多function,可能会或可能不会返回一个承诺,可能会或可能不会失败,如下面的示例中: //does not return a Promise, simply a string let goodFun = function(){ return "I like bananas!"; }; //blows up! let badFun = function(){ throw "A general error blaahh!"; }; //You get the point … 由于这些函数可能会也可能不会返回Promises,并且可能会也可能不会失败,所以我需要等待所有这些函数的执行。 为了实现这一点,我有一个函数来调用它们,并等待它们的执行: let asyncFun = function(){ return Promise.all([badFun(), goodFun()]); }; 问题 到现在为止还挺好。 我的代码调用asyncFun ,我期望它的一些函数实际上失败。 为了做好准备,我加了一句话: let executor = function(){ […]

打破mongoose的蓝鸟诺言链

我已经研究了几个相关的问题和答案,仍然无法find我想要做的解决scheme。 我正在使用Mongoose和Bluebird来承诺。 我的承诺链包含3个部分: 通过用户名获取用户1 如果find用户1,则通过用户名获取用户2 如果find用户1和用户2,则存储新的logging 如果步骤1或步骤2无法返回用户,我不想执行步骤3.但是,无法返回用户不会导致数据库错误,因此我需要手动检查有效的用户。 我可以在步骤1中使用Promise.reject() ,它会跳过第2步,但仍然会执行第3步。其他答案build议使用cancel() ,但我似乎无法做到这一点。 我的代码如下。 (我的函数User.findByName()返回一个promise。) var fromU,toU; User.findByName('robfake').then((doc)=>{ if (doc){ fromU = doc; return User.findByName('bobbyfake'); } else { console.log('user1'); return Promise.reject('user1 not found'); } },(err)=>{ console.log(err); }).then((doc)=>{ if (doc){ toU = doc; var record = new LedgerRecord({ transactionDate: Date.now(), fromUser: fromU, toUser: toU, }); return record.save() } else […]

NPM在我们的依赖package.json中locking依赖版本

所以我有一个应用程序拉入一些依赖。 我已经想出了如何很容易地locking下来,因此我的Package.json如下所示: "webpack": "2.2.1", 大! 所以webpack被locking到那个版本,但是我注意到webpack中的一些东西package.json。 他们不locking他们的依赖关系: "dependencies": { "acorn": "^4.0.4", "acorn-dynamic-import": "^2.0.0", "ajv": "^4.7.0", "ajv-keywords": "^1.1.1", "async": "^2.1.2", "enhanced-resolve": "^3.0.0", "interpret": "^1.0.0", "json-loader": "^0.5.4", "loader-runner": "^2.3.0", "loader-utils": "^0.2.16", "memory-fs": "~0.4.1", "mkdirp": "~0.5.0", "node-libs-browser": "^2.0.0", "source-map": "^0.5.3", "supports-color": "^3.1.0", "tapable": "~0.2.5", "uglify-js": "^2.8.5", "watchpack": "^1.2.0", "webpack-sources": "^0.2.0", "yargs": "^6.0.0" }, 所以有一天,我们的应用程序分拆了一个容器,并抓住webpack 2.2.1,就像它应该有的,但抓住了最新的uglify-JS导致我们的生产应用程序的问题。 无论如何,强制我们的依赖正在利用的依赖的版本?

续集多对多关联 – 未find方法

我有两个n:m sequelize模型,如下所示 // Organization Model module.exports = { attributes: { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, name: { type: Sequelize.STRING, required: true }, }, associations: function() { Organization.belongsToMany(Contact, { through : OrganizationContact, foreignKey: { name: 'organizationId', allowNull: false } }); } }; // OrganizationContact Model module.exports = { attributes: { id: { […]

Node.js:如何停止stream式传输数据

我使用请求npm模块创build一个请求。 但是,如果内容types不是json,我希望stream停止。 目前,它不会停止,并产生错误,因为解压缩读取一个无效的头.. 我们如何能够停止一个stream? var req = request(options) req .on('error', function (err) { console.log("err"); reject(err) }) .on('response', function(response) { if(response.headers['content-type'] != 'application/json') { console.log(response.headers['content-type']) req.destroy() // doesn't work this.destroy() // doesn't work } }) .on('end', function () { resolve() }) .pipe(gunzip) // ERROR!

编译hello world到wasm并运行在node中

我试图在node.js中运行一个webassembly模块,我得到一个Wasm decoding failedResult 。 我认为我的问题是将节点Buffer转换为ArrayBuffer 。 这是我的适用代码: fs.readFileAsync( WASM_PATH ) .then( buf => buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) ) .then( arrayBuffer => Wasm.instantiateModule(arrayBuffer) ) .then( results => console.log(results.instance) ) .catch( err => console.error(err) ); 我得到这个错误: (relevant details) Wasm decoding failedResult = expected version 0c 00 00 00, found 01 00 00 00 @+4 当我使用emcc hello_world.c -s […]

如何使用Node.js和Express在JavaScript中使用GET请求更改页面?

在这个应用程序,用户有一个表,他们可以input数据。 每行有一个“编辑”button,当他们点击那个button时,我想把他们带到一个叫“/ update”的新页面,在那里他们可以修改那个行的值。 我现在已经这样做了,当他们点击更新button时,它会运行editRow函数,传递表的id和行中的数据。 但是,我无法弄清楚如何让路线正常工作。 我使用的是Node.js,Express,Handlebars,但没有使用 jQuery。 app.js (服务器端) app.get('/update', function(req,res){ var context = {}; context.tableID = req.ID; context.element = req.element; res.render('update', context); }); update.handlebars <h1>test for now</h1> main.handlebars <!doctype html> <html> <head> <title>Workout Tracker</title> <link rel="stylesheet" href="css/style.css"> <script src="scripts/buttons.js" type="text/javascript"></script> </head> <body> {{{body}}} </body> </html> buttons.js (客户端) function editRow(tableID, element) { var httpRequest; httpRequest […]

使用Node.js和OSC.js在局域网内的计算机之间发送OSC

有没有人创build了一个使用Node.js在局域网内的计算机之间发送OSC的工作设置? 理想情况下,使用Colin Clark的osc.js包? 我有我认为应该是一个非常简单的例子,除了它不工作 – 我得到一个EADDRNOTAVAIL错误,这意味着远程地址不可用。 但是,我可以成功地ping其他笔记本电脑。 这里是代码和错误,供参考: 发送代码(笔记本电脑号码为192.168.0.5): var osc = require("osc"); var udp = new osc.UDPPort({ localAddress: "127.0.0.1", // shouldn't matter here localPort: 5000, // not receiving, but here's a port anyway remoteAddress: "192.168.0.7", // the other laptop remotePort: 9999 // the port to send to }); udp.open(); udp.on("ready", function () { console.log("ready"); […]

在Node.js中安全且正确地monkeypatching require函数

monkeypatching node.js中的require函数可能是有用的,特别是对于某些库。 我试图弄清楚我如何能够正确,安全地做到这一点。 这是我有什么: const Mod = require('module'); const req = Mod.prototype.require; Mod.prototype.require = function () { // do some side-effect of your own req.apply(this, arguments); }; 然而,这不是很有效,我不知道为什么。 我从debugging模块得到这个错误: TypeError: Cannot set property 'init' of undefined at Object.<anonymous> (/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/node_modules/debug/src/node.js:15:14) at Module._compile (module.js:571:32) at Object.Module._extensions..js (module.js:580:10) at Module.load (module.js:488:32) at tryModuleLoad (module.js:447:12) at Function.Module._load (module.js:439:3) at […]

使用多个值Express.js MongoDB部分更新嵌套对象

首先,我已经阅读了这个部分解决这个问题的堆栈溢出条目 ,但是我需要dynamic地添加多个条目,并且不能将答案应用于这个问题。 我有一个有民意调查的网站(使用express和mongodb驱动程序),我希望用户能够在提交之后向民意调查添加其他选项(他们只能添加其他项目,不能编辑预先存在的项目)。 所有选项(可能的答案)被标记为answer后面跟着一个数字(最多5个)。 所以在数据库中我们有: { "_id": { "$oid": "58cdf0023cefa56136afb50f" }, "question": "Who is the best Bob?", "options": { "answer1": { "option": "Bob Dylan", "votes": 2 }, "answer2": { "option": "Bob Geldof", "votes": 0 } } } 所以用这个条目,用户最多可以添加三个附加的答案选项。 当我硬编码的附加答案的名称(例如在这个数据库的例子答案3),我可以更新嵌套的options属性。 var toInsert = { options: { answer3: { option: 'Bob Saget', votes: 0 }, answer4: { […]