我需要使用Node设置OData服务器。我设法让Jaydata启动并运行Express,定义了一个模型,可以正确加载。我可以在SAPUI5表中正确显示条目。
基本上this thread是我的方向以及this tutorial。
以下是基本代码段落:
// ...
// Model.js
//
$data.Class.define("Cases.User", $data.Entity, null, {
Id: { type: "id", key: true, computed: true, nullable: false },
FirstName: { type: "string", required:true},
LastName: {type:"string", required:true},
Username: {type:"string", required:true},
Email: {type:"string", required:true},
isAdmin: {type:"boolean"},
Password:{type:"string", minLength: 8}
}, null);
$data.EntityContext.extend("CaseDatabase", {
Users: { type: $data.EntitySet, elementType: Cases.User }
});
$data.Class.defineEx("Cases.Context", [$data.EntityContext,$data.ServiceBase], null, {
User:{ type: $data.EntitySet, elementType: Cases.User }
});
exports = Cases.Context;
摘自router.js
:
app.use("/api", $data.JayService.OData.Utils.simpleBodyReader());
app.use("/api", $data.JayService.createAdapter(Cases.Context, function (req, res) {
return new Cases.Context({name: "mongoDB", databaseName:"cases", address: "127.0.0.1", port: 27017 });
}));
如上所述,这些链接就像魅力一样,我可以从MongoDB数据库中获取条目: / api / $ metadata和/ api / User
我不幸的是当我尝试通过SAPUI5客户端添加任何条目时。我遵循与上述问题相同的模式:
模型正确绑定到SAPUI5表,因为所述显示有效。
var oModel = new sap.ui.model.odata.ODataModel("/api");
oModel.setDefaultBindingMode(sap.ui.model.BindingMode.TwoWay);
var oTable = sap.ui.getCore().byId("UserList")
oTable.setModel(oModel);
oTable.bindRows("/User");
什么行不通,就是当我想添加用户条目时。我将数据填入变量,但将数据发回服务(/api
)始终会产生:
状态405 - 不允许的方法。
发布到URI:/api/User
会导致状态为500.
客户端代码:
...
OData.request({
requestUri: "/api/",
method: "POST",
data: user
},
function(insertedItem) {
console.log(insertItem);
},
function(err) {
console.log(err);
});
...
我注意到的另一件事是xml:base
看起来很奇怪(localhost:3000/api
):
<service xml:base="http://localhost:3000undefined/">
包含“未定义”。但是我不知道,这是否是我的问题的根源,其次是如何摆脱未定义的错误。
答案 0 :(得分:0)
我找到并调试了同样奇怪的uri基础,并通过JayService.js中的更改来修复它
更改此行:
req.fullRoute =(req.baseRoute ||(schema +'://'+ req.headers.host))+ app.route;
到此内容:
req.fullRoute =(req.baseRoute ||(schema +'://'+ req.headers.host))+ req.baseUrl;
然后你可以实际请求生成的URI并获得结果; - )