我正在尝试为Android应用程序开始编程api,并希望使用node.js + loopback。但是我在测试/学习语言方面遇到了一些麻烦。
以下代码应该在我的数据库中生成新用户(并且确实如此)但是当我尝试使用此用户登录时,没有AccessToken为控制台创建了一个printen。知道我做错了吗?
我的测试代码:create-test-data.js
var app = require('./app');
var dataSource = app.dataSources.mysql;
var loopback = require('loopback');
var User = loopback.User; // Getting User Model
var AccessToken = loopback.AccessToken; // Getting AccessTokenModel
/*
Initializing the database done by this. If already exist it will clean it.
dataSource.automigrate('user', function (err) {});
dataSource.automigrate('account', function (err) {});
dataSource.automigrate('accesstoken', function (err) {});
*/
//Creating some users in mysql database
User.create({username: 'timbo', email: 'test@gmail.com', password: 'monkey123'} , function(err, user) {console.log(user);});
User.create({username: 'timbo2', email: 'test2@gmail.com', password: 'monkey123'} , function(err,user) {console.log(user);});
User.create({username: 'timbo3', email: 'test3@gmail.com', password: 'monkey123'} , function(err,user) {console.log(user);});
User.login({username: 'timbo', password: 'monkey123'}, function(err, accesstoken) {console.log("This is the token: " + accesstoken);});
//No accesstoken created / saved in the database
datasource.json
{
"db": {
"defaultForType": "db",
"connector": "mysql",
"host": "127.0.0.1",
"database": "test",
"user": "root",
"password": "warcraft"
},
"push": {
"defaultForType": "push",
"connector": "loopback-push-notification",
"installation": "installation",
"notification": "notification",
"application": "application"
},
"mail": {
"defaultForType": "mail",
"connector": "mail"
},
"mysql": {
"connector": "mysql",
"host": "127.0.0.1",
"database": "test",
"user": "root",
"password": "warcraft"
}
}
models.json
{
"email": {
"options": {
"base": "Email"
},
"dataSource": "mail",
"public": false
},
"user": {
"options": {
"base": "User",
"relations": {
"accessTokens": {
"model": "accessToken",
"type": "hasMany",
"foreignKey": "userId"
}
}
},
"dataSource": "mysql",
"public": true
},
"accessToken": {
"options": {
"base": "AccessToken"
},
"dataSource": "mysql",
"public": true
},
"application": {
"options": {
"base": "Application"
},
"dataSource": "db",
"public": true
},
"acl": {
"options": {
"base": "ACL"
},
"dataSource": "db",
"public": false
},
"roleMapping": {
"options": {
"base": "RoleMapping"
},
"dataSource": "db",
"public": false
},
"role": {
"options": {
"base": "Role",
"relations": {
"principals": {
"type": "hasMany",
"model": "roleMapping",
"foreignKey": "roleId"
}
}
},
"dataSource": "db",
"public": false
},
"scope": {
"options": {
"base": "Scope"
},
"dataSource": "db",
"public": false
},
"push": {
"options": {
"base": "Push",
"plural": "push"
},
"dataSource": "push"
},
"installation": {
"options": {
"base": "Installation"
},
"dataSource": "db",
"public": true
},
"notification": {
"options": {
"base": "Notification"
},
"dataSource": "db",
"public": true
},
"product": {
"properties": {
"email": {
"type": "string"
},
"level": {
"type": "number"
},
"create": {
"type": "date"
},
"modified": {
"type": "date"
}
},
"public": true,
"dataSource": "db",
"plural": "products"
},
"account": {
"properties": {
"email": {
"type": "string"
},
"level": {
"type": "number"
},
"created": {
"type": "date"
},
"modified": {
"type": "date"
}
},
"public": true,
"dataSource": "mysql",
"plural": "accounts"
}
}
控制台输出
{ username: 'timbo',
email: 'test@gmail.com',
password: '$2a$10$972DFwMOuOhKj5ThfbchC.ipcNaW27ccpHMRkW17uSLutaCHyZF0G',
realm: undefined,
emailVerified: undefined,
verificationToken: undefined,
credentials: [],
challenges: [],
status: undefined,
created: undefined,
lastUpdated: undefined,
id: undefined }
{ username: 'timbo2',
email: 'test2@gmail.com',
password: '$2a$10$1peSixaOIQq8umOzzEy86OQKxoPFU.Ax2/NWC1oLGjQHPp9oZdPDW',
realm: undefined,
emailVerified: undefined,
verificationToken: undefined,
credentials: [],
challenges: [],
status: undefined,
created: undefined,
lastUpdated: undefined,
id: undefined }
{ username: 'timbo3',
email: 'test3@gmail.com',
password: '$2a$10$X3fdV2dL6kjuj69Dqr.jMeVdqIMzveN7NnJP5TXag54b4tpzZ4LGW',
realm: undefined,
emailVerified: undefined,
verificationToken: undefined,
credentials: [],
challenges: [],
status: undefined,
created: undefined,
lastUpdated: undefined,
id: undefined }
This is the token: undefined
This is the token err: Error: ER_BAD_FIELD_ERROR: Unknown column 'ttl' in 'field list'
答案 0 :(得分:1)
您必须首先将与用户相关的模型附加到您的数据源:
loopback.User.attachTo(dataSource);
loopback.AccessToken.attachTo(dataSource);
loopback.Role.attachTo(dataSource);
loopback.ACL.attachTo(dataSource);
定义User
和AccessToken
之间的关系:
loopback.User.hasMany(loopback.AccessToken, {as: 'accessTokens'});
创建测试数据时,您应该在调用User.create
之前等待User.login
完成。 (Rember,Node.js是异步的。)
User.create(
{username: 'timbo', email: 'test@gmail.com', password: 'monkey123'},
function(err, user) {
// TODO: handle err != null
User.login(
{username: 'timbo', password: 'monkey123'},
function(err, accesstoken) {
console.log("This is the token: " + accesstoken);
});
});