我正在使用Meteor进行Web应用程序,我们的想法是我们在客户端拥有所有功能,客户端将对我们的REST API执行API调用。问题是我没有管理向我们的API服务器发送任何HTTPS POST请求。互联网上有很多帖子说问题在CORS标题中,但API服务器发送标题:access-control-allow-origin:*。所以这不应该成为问题。
我有简单的登录模板,对于该模板,我将使用以下方式捕获提交事件:
import {Template} from 'meteor/templating';
import { HTTP } from 'meteor/http';
import "./login.html";
Template.login.events({
'submit .login_form'(event) {
const target = event.target;
let username = target.username.value;
let password = target.password.value;
// attempted HTTPS POST request
// Meteor.http.post(my_api_url, { // no success with this either
HTTP.call("POST", my_api_url, {
data: {
method: "login",
params: {
username: username,
passwrd: password
}
}
}, function (error, result) {
// we will end up here just fine, but 'error' contains error
// result is undefined
console.log(error);
});
// do stuff
},
});
console.log(result)给了我这个错误:
Error: network
Stack trace:
httpcall_client.js/HTTP.call/xhr.onreadystatechange@http://localhost:3000/packages/http.js?hash=2a49...181ea:243:20
是的,我已经用postman测试了API,它应该返回上面显示的数据。我在localhost中运行Meteor应用程序。
编辑: 我试图传递给API的Json是
{"method": "login",
"params": {"username": "username",
"passwrd": "password"}}
编辑2: 查看浏览器网络标签时,我看不到任何外出请求。
我的Meteor模板如下所示:
<template name="login">
<h1>Login</h1>
<form class="login_form" method="POST">
<input type="text" name="username" placeholder="Username"/>
<input type="password" name="password" placeholder="Password"/>
<input class="btn btn-success" type="submit" value="Log In"/>
</form>
</template>
答案 0 :(得分:1)
好像你的服务器端有错误。
根据http
package source code,只有在请求已完成但没有http答案的情况下,network
错误才会被抛出(传递给回调)。因此,这不是客户问题。
答案 1 :(得分:0)
我错了,或者你的回调不应该是:
function (error, result) {
//...
}
编辑:我没错:检查docs,示例中还使用了如上所示的样式的回调。
这至少可以解释,为什么结果是错误的。 (它没有解释为什么你的http调用本身会返回错误。)
编辑2:我在这里看到更多陷阱。
查看options
对象结构:
{
method: "POST",
params: {
username: username,
passwrd: password
}
}
也可以是:
{
method: "POST",
data: {
username: username,
passwrd: password
}
}
取决于您的Web服务要求。那么关于password
有一点 - 这是打算还是打字错误?
那么使用auth
{
method: "POST",
params: { // or data...?
username: username,
passwrd: password
},
auth: username+":"+password
}
这似乎是一个配置问题,具体取决于您的Web服务的要求。尝试不同的选项配置。必须有一个解决方案。
您可以添加手动调用Web服务的方式吗?
答案 2 :(得分:0)
我必须在函数开头添加event.preventDefault();
行
Template.login.events({
'submit .login_form'(event) {
event.preventDefault();
在我阻止客户端对我的meteor应用程序执行POST请求后,浏览器开始向API服务器发送OPTIONS请求。但这并没有完全解决问题。
然后问题是Meteor在端口3000中运行,并且API服务器设置CORS头:access-control-allow-origin:http://localhost,留下端口号,这就是为什么所有客户端请求在localhost中运行Meteor应用程序时失败。使用postman / cURL测试请求时,access-control-allow-origin标头始终设置为*,这与发送请求的浏览器不同。
安装lighttpd并将其设置为反向代理以在端口80中运行meteor app,然后在etc / hosts -file中为ip 127.0.0.1添加新主机名,例如: “127.0.0.1 localhost mymeteor.app”解决了我的问题。现在我必须在url mymeteor.app中访问我的Meteor应用程序并且它可以工作。
指向将lighttpd配置为代理的链接:https://redmine.lighttpd.net/projects/1/wiki/Docs_ModProxy