我有两个通过hasMany关系相关的模型.
Customer 有很多 CustomerPhones
在创建新内容时Customer,我想将相关内容CustomerPhones作为单个请求的一部分传递.这似乎是一种常见的需求,如果我想要实现的方法是错误的,那么这样做的首选方法是什么?
这是创建客户的URL: POST /api/Customers
上面url的请求将是req.body
{
"name": "Foo",
"customerPhones": [
{ "phoneNumber": "8085551234" },
{ "phoneNumber": "8085554567" }
]
}
Run Code Online (Sandbox Code Playgroud)
Loopback模型配置:
Customer.json
{
"name": "Customer",
"base": "User",
"properties": {
"name": {
"type": "string",
"required": true
}
},
"relations": {
"customerPhones": {
"type": "hasMany",
"model": "CustomerPhone",
"foreignKey": ""
}
}
}
Run Code Online (Sandbox Code Playgroud)
CustomerPhone.json
{
"name": "CustomerPhone",
"base": "PersistedModel",
"properties": {
"phoneNumber": {
"type": "string",
"required": true
},
"customerId": {
"type": "number",
"required": true …Run Code Online (Sandbox Code Playgroud) 有些问题我在文档中找不到答案.
我想要得到这样的结构:
Node:
id: '1sdf12asd123',
name: 'node1',
history:
[ ts: 234234234234,
data: { 'foo': 'bar' }
],
...
Run Code Online (Sandbox Code Playgroud)
所以每个单独的节点都有很多历史项.而且我希望能够在push不覆盖任何内容的情况下获得新数据.
现在,我不希望将所有内容存储在每个节点下,而是存储在单独的文档中,因此我认为embedsMany适合于此:
{
"name": "Node",
"plural": "Nodes",
"base": "PersistedModel",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {
"name": {
"type": "string"
}
},
"validations": [],
"relations": {
"history": {
"type": "embedsMany",
"model": "History",
"foreignKey": "HistoryId"
}
},
"acls": [],
"methods": {}
}
Run Code Online (Sandbox Code Playgroud)
所以历史可以简单地说:
{
"name": "History",
"base": "PersistedModel",
"idInjection": true,
"properties": {
"ts": {
"type": "Date"
},
"data": { …Run Code Online (Sandbox Code Playgroud) 我想使用cookie来保持用户登录.
在这个页面在这里,他们说
要使用cookie进行身份验证,请将以下内容添加到server.js(引导前):
Run Code Online (Sandbox Code Playgroud)app.use(loopback.token({ model: app.models.accessToken }));
看似简单.我认为在登录过程中,Loopback会自动设置cookie,但它仍然无法正常工作,我在Chrome开发工具中检查我的cookie并且没有设置.
我错过了什么吗?否则,什么是挂钩登录方法以设置cookie /标头的最佳方法?
我在这里找到了关于这个loopback.token()方法的文档,它确切地说明了它检查令牌的位置.
我在react-redux&API app上有一个客户端应用程序loopback.
对于我的本地测试,我在端口8080上运行客户端应用程序,在端口3000上运行服务器应用程序
当我尝试使用loopback-passport component客户端应用测试Google OAuth(使用)时,我收到以下错误.
当我使用POSTMAN测试它时,没有问题.
这是客户端代码,
require('babel-polyfill');
import { CALL_API } from 'redux-api-middleware';
import C from '../constants';
const API_ROOT = 'http://localhost:3000';
function googleLogin() { return async(dispatch) => {
const actionResp = await dispatch({
[CALL_API]: {
endpoint: API_ROOT + '/auth/google',
headers: {
'Access-Control-Allow-Credentials': 'false',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Origin': API_ROOT
},
method: 'GET',
types: ['GET', 'GET_SUCCESS', 'GET_FAILED']
}
});
if (actionResp.error) {
console.log(actionResp);
throw new Error('Some error in communication', actionResp);
} else {
console.log(actionResp);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用access_token处理逻辑表单环回.它工作正常,但不幸的是期望URL中的access_token.
我可以配置环回来使用标头自定义字段中的access_token吗?
我想要一个模型来代表我的环回应用程序中的配置文件。但是,loopback 中的内置 User 模型仅具有以下属性
扩展built-in User model以便插入更多属性(如phone number、profile picture和 the )的最佳方法是什么likes?
axios.put('http://localhost:3000/api/userDatas/findUserAddProp',{
params: {
userId: "5bb8c3bd16bf1f515ce5b42f",
prop: "questions",
questionId: "5bb8c466cb49d8421c05eeda"
}
});
Run Code Online (Sandbox Code Playgroud)
服务器
Userdatas.findUserAddProp = function(req, res, cb) {
const queryId = req.query.userId;
const propToUpdate = req.query.prop;
const questionId = req.query.questionId;
console.log("queryId: ", queryId);
console.log("propToUpdate: ", propToUpdate);
console.log("questionId: ", questionId);
...
}
Run Code Online (Sandbox Code Playgroud)
这是控制台上的服务器输出。
queryId: undefined
propToUpdate: undefined
questionId: undefined
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我刚刚将所有参数传递给服务器?
我找到了以前版本的文档https://loopback.io/doc/en/lb3/Environment-specific-configuration.html但我找不到版本 4 的文档
我缺少某些东西或 v4 尚不支持特定于环境的配置?
我使用 Keycloak 4.8.0 作为身份验证服务器。我已经配置了一个领域,该领域发布使用 EC512 签名的 JWT。我https://example.com/auth/realms/myrealm/protocol/openid-connect/token通过提供用户的客户端 ID、客户端密码、用户名和密码通过端点获取令牌。
当通过 Keycloak 自省 JWT 时,https://example.com/auth/realms/myrealm/protocol/openid-connect/token/introspect它显示为有效。然后我在 LoopBack 4 之上构建了一个 Node.js 应用程序,它提供了一个 REST 服务。在那里我想用passport-jwt. 我提供了公钥,但我总是收到错误TypeError: "ES512" signatures must be "132" bytes, saw "138"。(有趣的是,当使用 Keycloak 4.7.0 时,错误是TypeError: "ES512" signatures must be "132" bytes, saw "139")。
所以签名似乎是无效的。例如,https : //jwt.io能够解码 JWT,但在提供公钥时也不会显示有效签名。公钥可能无效。除了从管理控制台复制密钥之外,我还用来https://example.com/auth/realms/myrealm/protocol/openid-connect/certs检索密钥。然后我在这个答案的帮助下将其转换为 PEM 。键匹配。
所以我在这里有点不知所措。当然,Keycloak 有可能生成无效签名,但我对此表示怀疑。更有可能是我做错了什么,可能是在领域配置上,但我看不到哪里。
对于任何想要尝试验证签名的人来说,这里有一个 JWT 示例,我如上所述获得了它:
eyJhbGciOiJFUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJwdEVYeWpnbGlwdlp3OGRXSUc1Ml8xNFpONTdnWHNtWUdrdUVJSEplSVJrIn0.eyJqdGkiOiJiNmI1NTI4Ni0zY2NiLTRiNzQtYWFlZC1hOGI2MzBiZjQ5NmEiLCJleHAiOjE1NDUwODM0NjYsIm5iZiI6MCwiaWF0IjoxNTQ1MDgzMTY2LCJpc3MiOiJodHRwczovL2F1dGguaW5tYXQubG9jL2F1dGgvcmVhbG1zL2lubWF0IiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjViNWQ5NmI1LTBmZjgtNDAyYi05NDAxLTQyYTExODAzMjFlZiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlubWF0IiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiZjAxMmIzOTMtYTY0Ny00ZDhkLTk4MDQtZDQ3MzNkM2Y4MjVjIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdGVyIiwiZW1haWwiOiJ0ZXN0ZXJAdGVzdC5jb20ifQ.MIGIAkIBzvH1R-9fNFp8jlw-TeFidmC03uNov6IhDc23XMB9eHga8zdF4ybDmxDoAkB-NAJnDRUDNCtw3ooRxNSApje9oCkCQgHkrbYSN3L5LBA1OM5yb9WSQVaxItcspnCtMtW1QogaAYp0v9JwQA7VHL6ofEp3pcXLaKnFzVgP6FvDCwGgIJGFfw
Run Code Online (Sandbox Code Playgroud)
这是我从管理控制台复制得到的公钥:
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBTrJ+u+k3rqKmuvzykwcMfJMVEieQtc1ldlj2Q9vfsWHbNc95xmnsIgcYcsJNVZCY8NnzFBmYSa0G7rNjclS8xGQB4uDs4KV91WaDRmc3DqwDvupvWVw3M1RG64FteoGwq098p6bxog/tgyNWeYzOTpfunXi0Yp4p+ZrMxlaYdSMuDyU=
Run Code Online (Sandbox Code Playgroud)
由于passport-jwt需要 PEM 格式,因此我将其输入到库中,如下所示:
-----BEGIN PUBLIC KEY-----
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBTrJ+u+k3rqKmuvzykwcMfJMVEieQ
tc1ldlj2Q9vfsWHbNc95xmnsIgcYcsJNVZCY8NnzFBmYSa0G7rNjclS8xGQB4uDs
4KV91WaDRmc3DqwDvupvWVw3M1RG64FteoGwq098p6bxog/tgyNWeYzOTpfunXi0 …Run Code Online (Sandbox Code Playgroud) 我在环回中的模型上添加了验证规则。验证工作正常,但我得到的响应消息在某种程度上是自动生成的。我需要根据验证发送自定义响应对象。
我的模型验证是 5 的乘数,如下所示
@property({
name: 'name',
description: "The product's common name.",
type: 'number',
required: true,
// Specify the JSON validation rules here
jsonSchema: {
multipleOf: 5
},
})
counter: number;
Run Code Online (Sandbox Code Playgroud)
我收到如下验证消息
{
"error": {
"statusCode": 422,
"name": "UnprocessableEntityError",
"message": "The request body is invalid. See error object `details` property for more info.",
"code": "VALIDATION_FAILED",
"details": [
{
"path": ".counter",
"code": "multipleOf",
"message": "should be multiple of 5",
"info": {
"multipleOf": 5
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我需要根据我的要求修改响应对象,我可以更新这个响应对象吗?
loopbackjs ×10
node.js ×4
javascript ×3
strongloop ×2
axios ×1
cors ×1
express ×1
jwt ×1
keycloak ×1
loopback ×1
loopback4 ×1
model ×1
put ×1
reactjs ×1
redux ×1
typescript ×1
validation ×1