Articles of sequelize.js

对Sequelize协会感到困惑

我刚刚发现Sequelize是一个很好的ORM框架,可以在我的节点+ MySQL webapp中使用。 但是当我devise我的数据库表时,我对Sequelize关联感到困惑。 只要想一想,webapp中的用户和系统通知就是一个非常简单的例子: 该网站有许多用户 该网站会向一些或每个用户发送通知,并且相同的通知只保存为一条logging 用户可以知道他/她收到的任何通知是否被读取(通过读取date) 然后我devise了3个表格: User : id , name Notification : id , title , content , sendAt Notify : id , UserId (作为接收者), NotificationId , readAt 我可以简单地通过Sequelize定义User和Notification模型。 但是我只是不知道如何使用关联使Notify与这两个表相关,通过外键UserId和NotificationId 。 我试图使用这样的hasOne关联: Notify.hasOne(User); Notify.hasOne(Notification); 然后在User和Notification表中都有一个NotifyId列。 这不是我的期望。 也许我认为使用关联的方式是错误的,所以我想知道如何正确使用它? 另外,如果我想以JSON的forms获得结果: [ {id: 123, user: [Object some user], notification: [Object some notification], readAt: null}, […]

validation错误被忽略

我有一个模型定义如下: var userTableConfig = { username: { type: Sequelize.STRING, allowNull: false, unique: true, validate: { len: [5, 30], is: ['[a-z0-9_]', 'i'] } }, email: { type: Sequelize.STRING, allowNull: false, unique: true, validate: { isEmail: true, len: [5, 30] } }, …………. // Other fields } var userConfig = userConfig = { underscored: true, instanceMethods: { […]

节点js导出variables维护引用 – 通过引用传递?

嘿,我只是想确保我不会犯这个巨大的错误。 我正在使用Sequelize.js作为node.js项目。 我想确保我通过参考和有人请解释这个概念,是否有更好的方法来做到这一点。 var sequelize = new Sequelize(database, user, password); exports.User = User = sequelize.import(__dirname + '/models/user'); exports.Comment = Comment = sequelize.import(__dirname + '/models/comment'); User.hasMany(Comment); Comment.belongsTo(User); // I dont want my code to look like this exports.User.hasMany(exports.Comment); 我想我正在做的是引用相同的内存。 所以如果用户被改变,它也会改变出口。用户。 是对的吗? 我这样做的原因是,我想在我的models.js文件中使用variables用户,使其更容易做User.hasMany(评论)等等,也能够导出相同的variables,其余的我的应用程序。 任何build议,警告,见解?

从asp.mvc应用程序迁移到以devise为重点的node.js应用程序

我目前正在寻找替代平台来迁移现有的应用程序,它开始作为一个原型使用asp.mvc但大多数的代码是一个简单的ASP MVC的Web服务的JavaScript,所以我们正在考虑推进它似乎是合理的我们只是取消当前的微软堆栈,只是为了让我们有更多的自由,我们可以在Web服务和前端重用一些模型和代码,尽pipe这可能会结束只是less量。 这可能是一个相当大的问题,包括许多部分,但无论如何,我肯定会把它放在那里,因为我确信这可能会帮助许多其他人看到他们如何从.net / java移动到node.js 。 由于大多数这些静态types的语言有很多使用的模式和实践,例如控制反转,工作单元,面向方面编程等等,看起来有点奇怪,正朝另外一个平台发展,似乎并不需要这么多的结构。面积…所以我有一些担心,从我的超级结构化testing世界转移到这个新的看似非结构化和dynamic的世界。 所以这里是我在MVC中要做的主要事情,并且现在想要在node.js中做,但是我不太确定实现相同级别的分离或function的最佳方式。 路由到操作 在MVC中的这种机制似乎可以通过node.js中的Express来替代,这将使我能够将路由映射到方法。 但是有一些担忧: 在ASP MVC我的控制器可以被dependency injection,并有variables,所以行动很容易testing,因为他们所依赖的一切都可以在需要时被模拟,并通过构造函数传入。 然而,因为expression式中的方法似乎没有包含范围,所以似乎我将不得不使用全局variables或在内部新buildvariables。 有没有一种很好的方式来访问这些路由方法中的业务逻辑容器? 有没有办法自动绑定发送的模型? 或者至less得到一些有用的方式json / xml等? 看来,如果你发送正确的MIMEtypes的内容,它可以提取,但我没有看到这个在线的任何明确的例子。 我很高兴在Express上使用额外的框架来提供这个function,理想情况下,我只想对/user/1发出一个POST请求,并将用户对象拉出来,并用数据库中的id 1更新用户我们稍后会谈)。 validation正在发送的数据的最佳方式是什么? 目前在我们的前端JavaScript应用程序,我们使用KnockoutJS和所有模型使用敲除observables和validation使用Knockout.Validation。 我很高兴在节点上使用Knockout Validation,因为模型是前端和后端之间的契约,但是如果有更好的解决scheme,我很乐意去查看它。 数据库交互 目前在.net领域,我们使用NHibernate与我们的关系数据库进行通信,并使用MongoDB驱动程序与我们的MongoDB数据库进行通信。 我们使用Generic Repository模式,将查询隔离到自己的类中。 我们也使用了一个Unit Of Work模式,所以我们可以将逻辑上的单词块包装到一个事务中,然后在完成的时候全部提交,或者如果没有的话就回滚。 这使我们能够在几乎任何级别上模拟我们的对象,这取决于我们想要testing的内容,还可以让我们轻松地更改我们的实现。 所以这是我的担心: Sequalize似乎很适合replaceNHibernate,但它似乎没有任何事务处理,使得很难做出一个单位的工作模式。 如果不能以同样的方式完成,那么这不是世界末日,但是我希望能够以某种方式对一大块工作进行分组,所以像CreateNewUserUnitOfWork这样的一个动作可以用一个表示用户的模型详细信息,validation它,在一个表中创build一个条目,然后在其他人创build一些关系数据等,从数据库中获取用户ID,然后发回(假设一切顺利)。 从查看QueryChainer看来,它似乎提供了大部分的function,但是如果在5个操作中的第3个操作失败,它看起来不是简单的回滚,那么是否有一些方法来获得这个级别的控制? 插件/分散的configuration数据 这对我们的应用程序来说更是一个小众关注的问题,但是我们有其他的包含插件的dll。 有放入bin文件夹,然后将挂钩到路由,数据库和validationconfiguration。 想象一下,就像拥有谷歌主页,谷歌地图,文档等都是插件,告诉主要应用程序路由额外的调用插件,然后有自己的模型和数据库configuration等方法。这里是我的关注: 似乎有一种方法来更新路由,只需扫描目录中的新插件并包含它们( node.js需要文件夹中的所有文件? ),但有没有做这种事情的一些最佳做法,因为我不希望每个请求不得不不断做目录扫描。 假设我很高兴在启动节点应用程序时将插件放在正确的位置,所以在运行时不需要添加插件。 testing 目前在应用程序中有单元,集成,验收testing。 unit testing发生在前端和后端,所以目前它将在我们的构build脚本中使用JsTestDriver进行javascripttesting,以确认所有业务逻辑如预期的那样独立运行。然后我们进行了集成testing, C#将会testing我们的控制器和动作如预期的那样工作,以及任何工作单位等等,这再一次由构build脚本启动,但也可以通过Resharperunit testing运行器运行。 然后,最后我们通过使用networking驱动程序编写的validationtesting,它只是针对前端,并通过浏览器testing所有function。 我主要关心的是: […]

Sequelizejs没有显示所有的validation错误或消息

这是我的models.js var User = require('../../managedb').User; module.exports = function(sequelize, DataTypes) { return sequelize.define('User', { username: { type: DataTypes.STRING, unique: { msg: "Username already exists!" } }, password: { type: DataTypes.STRING, len: { args: 6, msg: "Password must be atleast 6 characters in length" } }, email_id:{ type: DataTypes.STRING, unique:{ msg: "Email already exists!" }, validate: { […]

在节点JS的权限

我正在使用快递和续集制作应用程序。 有用户和pipe理员。 现在,我正在通过中间件处理权限。 说有一个消息,用户可以改变: var Message = sequelize.define('Message', { content: Sequelize.STRING, secret: Sequelize.STRING }); var message = Message.build({ content: 'i like frogs', secret: 'i like hogs more!' }); app.put('/message', requireRole('user'), function(request, response) { message.updateAttributes(request.body.content); response.writeHead(200); response.end('secret updated'); }); 我想有一些更复杂的权限。 什么是这样做的好方法? 在这个例子中,我希望用户能够更新消息的content ,但不是它的secret 。 我可以把它烧成每一条路线,但是随着车型的改变,似乎会变得很痛苦。 app.put('/message', requireRole('user'), function(request, response) { var attrs = {}; var role […]

node.js + sequelize +顺序执行

在我的节点应用程序中,我必须执行2个查询1之后(即)我必须执行基于第一个查询结果的第二个查询。 我的代码: var levels; try { sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) { levels = results; }).failure(function(err) { if (err) { logger.error(err.stack); throw (err); } else { if (callback) { callback(err, null); } } }); } catch (err) { } if (level == 2) { query = "select *from […]

Sequelize JS / Bluebird:从asynchronous并行数据库调用开始

我有个问题。 我想开始2分贝的电话,然后继续承诺链。 我做的一个相当怪异的做法是像这样开始承诺: db.Model.find().then(function() { return [ firstcall, secondcall ] }).spread(function(resultFromFirstCall, resultFromSecondCall) { //do something once both calls completed }); 用空数据库调用启动promise链可以吗? 或者,还有更好的方法。 我知道我可以引入asynchronous库,但是我认为这是一个更清洁的方法,如果没有性能影响,使空的db.Model.find()调用。

等待循环完成callback

来自PHP的背景,我试图让我的头在这个callback的东西。 基本上我想获得一些行,然后我想循环这些行,并检查他们对其他模型(不同的数据库)。 我希望回拨等待,直到他们都被循环和检查。 在sequelize遍历所有结果之前调用callback函数。 基本上我想要的function是“阻止”。 我需要改变什么? toexport.getlasttransactions = function(lower,upper,callback){ var deferred = Q.defer(); var transactionsToUpdate = []; /////////////////////////// // set import conditions // /////////////////////////// var lowerbound = (lower) ? lower.format() : moment.utc().subtract(10, 'minutes').format(); var upperbound = (upper) ? upper.format() : moment.utc().format(); /////////////////////////////// // get IDs From Failed syncs // /////////////////////////////// FailedSync.find({ limit: 100 }) .then(function(res){ […]

Sequelize.js多次急切的加载

我有2个模型: User和Team 有多种types的用户(在这种情况下是指导者和版主),它们使用User模型()中的属性进行区分。 User和Team之间的关联如下: User.hasMany(models.Team, {as: 'Mentors', through: models.TeamMentor, foreignKey: 'mentorId'}); User.hasMany(models.Team, {as: 'Moderators', through: models.TeamModerator, foreignKey: 'moderatorId'}); Team.hasMany(models.User, {through: models.TeamMentor, foreignKey: 'teamId'}); Team.hasMany(models.User, {through: models.TeamModerator, foreignKey: 'teamId'}); 现在,我正在尝试为所有分配给团队的导师和版主分配团队的细节以及单独的对象。 我从文档中了解了许多到许多关系的getter和setter,但是我不知道如何使用这个方法,因为这里有两种不同的关联: 团队 – 导师(用户) 团队 – 主持人(用户) 在这种情况下如何正确查询团队的详细信息? PS: TeamMentor和TeamModerator是空模型来帮助多人连接