- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 Mocha、Mongoose 和 MongoDB。
我的目标只是围绕创建帐户进行测试。我有以下代码:
require( "./../../config/config" );
var mongoose = require( "mongoose" );
mongoose.connect( process.env.MONGODB_URI );
const expect = require( "expect" );
var { Account } = require( "./../../models/account" );
describe( "Account Creation", () =>
{
it( "should successfully create an account", ( done ) =>
{
var data =
{
username: "PrestonJ",
email: "someEmail@mail.com",
password: "somePassword123!"
};
var account = new Account( data );
account.save().then( ( result ) =>
{
console.log( "(temporary log) account saved" );
done();
}).catch( ( e ) => done( e ) );
});
});
Mongoose promise 链执行并将新帐户保存到数据库中,但是 done()
永远不会到达(即使它被写入,并且上面的控制台调用有效)。
这导致 Mocha 测试失败,给我:错误:超时超过 2000 毫秒。对于异步测试和 Hook ,确保调用“done()”;如果返回一个 Promise,请确保它已解析。
我试图只返回
Promise 链,但这也不起作用。我也尝试过完全删除 done
并返回链,但无济于事。
几个小时过去了,我一直找不到正确的做法/修复方法。
编辑:我试过增加 Mocha 的超时时间。错误是否以某种方式被吞没了?它在我的模型文件中吗?
编辑 2:这是帐户模型的来源:
var mongoose = require( "mongoose" );
const _ = require( "lodash" );
const validator = require( "validator" );
const jwt = require( "jsonwebtoken" );
const bcrypt = require( "bcryptjs" );
let Account_CollectionName = "accounts";
var Account_Schema = new mongoose.Schema(
{
username:
{
type: String,
minLength: 3,
trim: true,
required: true,
unique: true
},
email:
{
type: String,
minlength: 1,
trim: true,
required: false,
unique: true,
sparse: true,
validate: validator.isEmail,
message: "{VALUE} is not a valid email"
},
password:
{
type: String,
required: true,
minLength: 5
},
tokens:
[{
access:
{
type: String,
required: true
},
token:
{
type: String,
required: true
}
}],
},
{
collection: Account_CollectionName
});
Account_Schema.pre( "save", function( next )
{
var account = this;
if( account.isModified( "password" ) )
{
bcrypt.genSalt( 10, ( err, salt ) =>
{
bcrypt.hash( account.password, salt, ( err, hash ) =>
{
account.password = hash;
next();
});
});
}
else
next();
});
Account_Schema.methods.toJSON = function()
{
var account = this;
var accountObject = account.toObject();
return _.pick( accountObject,
[
"_id", "username", "email"
] );
};
Account_Schema.methods.generateAuthToken = function()
{
var account = this;
var access = "auth";
var token = jwt.sign( { _id: account._id.toHexString(), access }, process.env.JWT_SECRET ).toString();
account.tokens = account.tokens.concat( [{ access, token }] );
return account.save().then( () =>
{
return token;
});
};
Account_Schema.statics.findByToken = function( token )
{
var Account = this;
var decoded;
try {
decoded = jwt.verify( token, process.env.JWT_SECRET );
}
catch( e )
{
return Promise.reject();
}
return Account.findOne(
{
"_id" : decoded._id,
"tokens.token": token,
"tokens.access": "auth"
});
};
Account_Schema.statics.findByCredentials = function( username, password )
{
var Account = this;
return Account.findOne( { username } ).then( ( account ) =>
{
if( ! account )
return Promise.reject();
return new Promise( ( resolve, reject ) =>
{
bcrypt.compare( password, account.password, ( err, res ) =>
{
if( res )
resolve( account );
else
reject();
});
});
});
};
Account_Schema.methods.removeToken = function( token )
{
var account = this;
return account.update(
{
$pull:
{
tokens: { token }
}
});
};
var Account = mongoose.model( Account_CollectionName, Account_Schema );
module.exports = { Account };
最佳答案
我想通了。许多事情需要完成;这是 it
block 的固定源代码:
it( "should successfully create an account", () =>
{
var data =
{
username: "PrestonJ",
email: "someEmail@mail.com",
password: "somePassword123!"
};
let account = new Account( data );
return account.save().then( ( result ) =>
{
if( result )
{
console.log( "Successful!" );
return Promise.resolve();
}
else
return Promise.reject( "cannot save" );
}).catch( ( e ) =>
{
return Promise.reject( e );
});
});
done
/done()
的所有痕迹返回
account.save().then(...)...
then()
中,使用 return Promise.resolve()
而不是 done()
catch()
中,使用 return Promise.reject(e)
而不是 done(e)
关于node.js - Mocha 抛出超时,但 Mongoose 将数据保存到 Promise 链中的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52069953/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!