我遇到一个奇怪的问题,它说column "scopes" does not exist
。这是我在服务器中遇到的日志,但在本地环境中没有:
Unhandled error for request GET /api/continents?access_token=aaaaaaaaaaabbbbbbbbbbbbbbbbL1AwzSoH8eHXwPdjzQATRXqto3lngEokVxR2j: error: column "scopes" does not exist
2017-05-05T04:35:06.642201+00:00 app[web.1]: at Connection.parseE (/app/node_modules/pg/lib/connection.js:569:11)
2017-05-05T04:35:06.642202+00:00 app[web.1]: at Connection.parseMessage (/app/node_modules/pg/lib/connection.js:396:17)
2017-05-05T04:35:06.642203+00:00 app[web.1]: at TLSSocket.<anonymous> (/app/node_modules/pg/lib/connection.js:132:22)
2017-05-05T04:35:06.642204+00:00 app[web.1]: at emitOne (events.js:96:13)
2017-05-05T04:35:06.642209+00:00 app[web.1]: at TLSSocket.emit (events.js:188:7)
2017-05-05T04:35:06.642210+00:00 app[web.1]: at readableAddChunk (_stream_readable.js:176:18)
2017-05-05T04:35:06.642210+00:00 app[web.1]: at TLSSocket.Readable.push (_stream_readable.js:134:10)
2017-05-05T04:35:06.642211+00:00 app[web.1]: at TLSWrap.onread (net.js:547:20)
涉及访问令牌的所有API都出于同样的原因失败。如果未设置访问令牌,则API按预期工作(如果是公共的,我获取数据;如果需要身份验证,则获得401/403)。
我试过本地 - 它有效,我试过heroku local
- 它也有效。经过长时间的测试,我发现差异(和已验证)是我的本地和heroku local
正在运行环回版本3.4.0,而我的服务器运行3.8.0。
我强制服务器使用3.4.0后,这是正常的。
深入研究/node_modules/loopback/common/models/access-token.json
,以下是3.4.0和3.8.0之间的差异:
Loopback 3.4.0:
"name": "AccessToken",
"properties": {
"id": { "type": "string", "id": true },
"ttl": { "type": "number", "ttl": true, "default": 1209600, "description": "time to live in seconds (2 weeks by default)" },
"created": { "type": "Date", "defaultFn": "now" }
},
Loopback 3.8.0:
"name": "AccessToken",
"properties": {
"id": { "type": "string", "id": true },
"ttl": { "type": "number", "ttl": true, "default": 1209600, "description": "time to live in seconds (2 weeks by default)" },
"scopes": {
"type": ["string"],
"description": "Array of scopes granted to this access token."
},
"created": { "type": "Date", "defaultFn": "now" }
},
由于我没有签入node_modules,有谁知道如何解决这个问题?
答案 0 :(得分:2)
我刚从升级到Loopback v3.8遇到了同样的问题。
您可以通过使用脚本自动更新AccessToken表来解决此问题。这是autoupdate脚本的基本版本。
var path = require('path');
var app = require(path.resolve(__dirname, '../server/server'));
var ds = app.datasources.db;
function update() {
// migrate AccessToken
ds.autoupdate('AccessToken', function (err) {
console.log("ds.autoupdate('AccessToken', err=", err)
if (err) throw err;
ds.disconnect();
}); // autoupdate('AccessToken')
}
// console.log("ds=", ds)
console.log("ds.connected=", ds.connected)
if(ds.connected) {
// Run autoupdate
update();
} else {
ds.once('connected', function() {
// Run autoupdate
update();
});
}
&#13;
您可以通过将其命名为autoupdate.js,将其放在服务器目录的根目录中,然后在控制台中运行node autoupdate.js
然后你会变得金黄。
答案 1 :(得分:1)
我遇到了从lb2.x转到lb3.17.0的同样的麻烦
刚做了一张转换表: ALTER TABLE accesstoken ADD范围TEXT;