Javascript 为什么前端从express server接收空对象?
试图找出如何使用javascript的Javascript 为什么前端从express server接收空对象?,javascript,node.js,express,response,Javascript,Node.js,Express,Response,试图找出如何使用javascript的fetch()和express服务器实现此请求和响应场景 这是服务器: var express = require('express'), stripeConnect = require('./routes/connect'), cors = require('cors'), bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.u
fetch()
和express服务器实现此请求和响应场景
这是服务器:
var express = require('express'),
stripeConnect = require('./routes/connect'),
cors = require('cors'),
bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cors());
app.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Credentials', 'true');
next();
});
app.use('/connect', connect);
app.listen(process.env.PORT || 5000);
以下是路线/连接:
const express = require('express');
const router = express.Router();
const admin = require('firebase-admin');
admin.initializeApp({
credential: admin.credential.cert({
projectId: process.env.projectId,
clientEmail: process.env.clientEmail,
privateKey: process.env.privateKey.replace(/\\n/g, '\n'),
clientId: process.env.clientId
}),
databaseURL: process.env.databaseURL
});
const STRIPE_SK = 'sk_test_KEY';
const stripe = require('stripe')(STRIPE_SK);
// @route POST /stripeConnect/link
// @desc save stripe user account id to their firebase profile
// @access public
router.post('/link', (req, res) => {
console.log('\nLINK-REQUEST-BODY => ');
console.log(req.body);
return admin
.firestore()
.collection('users')
.doc(req.body.docId)
.update({ stripeId: 'test_Id' })
.then((success) => {
console.log('Firestore Update: Success');
res.json({ msg: 'Stripe account ID added to Slide profile.' });
})
.catch((err) => {
console.log('Firestore Update: Fail, Error: ' + err.message);
res.json({ msg });
});
});
module.exports = router;
这是回帖:
function submit() {
$("#progress-label").text("Working...")
const request = {
method: "POST",
body: JSON.stringify({
docId: $('#id').val(),
stripeId: USER_ID
}),
mode: 'cors',
headers: { 'Content-Type': 'application/json'}
}
fetch(SERVER_URL + "/link", request).then(res => {
console.log("res => " + res)
console.log("res.json() => "+ res.json())
console.log("JSON.stringify(res.json()) => "+ JSON.stringify(res.json()))
console.log("res.data => " + res.data)
console.log("res.msg" => + res.msg
}).catch(err => {
document.getElementById("label").innerHTML = res.json()
})
}
express服务器记录Firebase更新成功的日志
前端日志:
res => [object Response]
res.json() => [object Promise]
JSON.stringify(res.json()) => {}
res.data => undefined
res.msg => undefined
只是想弄清楚如何从express获得正确的响应。不知道这些日志症状告诉了我什么。我只是想记录我能想到的处理响应对象的所有不同方式
我需要做什么才能获得响应数据?您的.then()函数只是一个承诺,因为一旦您从请求中获得了头,您就需要在res.json()的.then()中返回响应(res.send()),因为它也是一个承诺。因此,请按照下面的说明修改您的路由/连接
router.post('/link', (req, res) => {
console.log('\nLINK-REQUEST-BODY => ');
console.log(req.body);
return admin
.firestore()
.collection('users')
.doc(req.body.docId)
.update({ stripeId: 'test_Id' })
.then((success) => {
console.log('Firestore Update: Success');
res.json().then(data => ({
data: data,
status: response.status
})
).then(res => {
console.log(res.status, res.data)
})
.catch((err) => {
console.log('Firestore Update: Fail, Error: ' + err.message);
res.json({ msg });
});
});
您需要再添加一个.then(),因为您的res.json()也是一个承诺。使用您建议的修改检查下面的答案,在不更改前端代码的情况下,结果是:前端错误:Uncaught(承诺中)语法错误:JSON输入的意外结束
,Uncaught(承诺中)TypeError:未能对“响应”执行“json”:主体流被锁定,服务器端日志为:Firestore更新:成功2020-03-13T21:13:26.035495+00:00应用程序[web.1]:Firestore更新:失败,错误:res.json(…)。然后不是函数