Javascript 如果在函数中的任何位置使用,则云函数请求显示未定义,但如果您只是通过控制台记录它们,它们将正常运行
所以这是一个非常奇怪的问题,我已经修补了一段时间,似乎无法弄清楚这里到底发生了什么,哈哈。我有一个firebase函数,我用它从craigslist获取一些数据,然后返回并响应。我使用request发送我需要在cloud函数中搜索的一些值Javascript 如果在函数中的任何位置使用,则云函数请求显示未定义,但如果您只是通过控制台记录它们,它们将正常运行,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,所以这是一个非常奇怪的问题,我已经修补了一段时间,似乎无法弄清楚这里到底发生了什么,哈哈。我有一个firebase函数,我用它从craigslist获取一些数据,然后返回并响应。我使用request发送我需要在cloud函数中搜索的一些值 exports.clSearch = functions.https.onRequest((request, response) => { console.log(request.body.keyword); console.log(reque
exports.clSearch = functions.https.onRequest((request, response) => {
console.log(request.body.keyword);
console.log(request.body.city);
let client = new craigslist.Client({
city: "seattle",
});
options = {
category: "vga",
maxPrice: "500",
minPrice: "100",
};
client
.search(options, "xbox one")
// eslint-disable-next-line promise/always-return
.then((listings) => {
// play with listings here...
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.send(listings);
})
.catch((err) => {
console.error(err);
});
});
因此,当我运行上面的函数时,控制台会记录请求作为正确的值通过,并且一切都会正常运行。现在看看下面这个:
exports.clSearch = functions.https.onRequest((request, response) => {
console.log(request.body.keyword);
console.log(request.body.city);
let client = new craigslist.Client({
city: request.body.city,
});
options = {
category: "vga",
maxPrice: "500",
minPrice: "100",
};
client
.search(options, request.body.keyword)
// eslint-disable-next-line promise/always-return
.then((listings) => {
// play with listings here...
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
response.send(listings);
})
.catch((err) => {
console.error(err);
});
});
现在我所做的基本上就是在函数中使用这些请求值,而不仅仅是记录它们。但是,当我这样做时,由于控制台日志中的某些原因,它会导致请求通过未定义。为什么仅仅在函数中使用这些请求值会导致请求通过未定义的路径
即使我只是加上
let keyword = request.body.keyword;
在控制台日志下面,它会导致上面的控制台日志返回为未定义。但是如果我只在开始时通过控制台日志调用request.body.keyword/request.body.city,那么它们完全可以通过。只有当我将它们添加到函数中的任何其他位置时,它才会导致所有内容都返回未定义状态。这简直毫无意义
这就是我向函数发送请求的方式
handleSearch = () => {
var xhr = new XMLHttpRequest();
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open(
"POST",
"https://*****.cloudfunctions.net/clSearch"
);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(
JSON.stringify({
keyword: "xbox",
city: "orlando",
})
);
};
虽然我不认为这是问题的一部分,但无论如何,如果我错了,我会证明这一点
希望你们中的一个超级聪明的家伙能明白这一点,或者其他人也经历过这一点,可以帮助lol
即使我这样做
let data = request;
let rKey = data.body.keyword;
let rCity = data.body.city;
console.log(rCity);
console.log(rKey);
这两个控制台日志将作为正确的值返回。但如果我只是简单地给
let client = new craigslist.Client({
city: rCity,
});
然后,两个控制台日志显示rCity和rKey的值未定义,即使它们完全正确地记录了正确的值,直到我尝试使用下面的值为止。这毫无意义。这是由节点模块node craigslist造成的,操那个节点模块=D,简单地使用一个新模块就解决了这个问题。这是由节点模块node craigslist造成的,操那个节点module=D,简单地使用一个新模块就解决了这个问题。我注意到您正在将CORS头设置为这个云函数响应的一部分。您能否澄清此云功能是否同时处理POST请求和飞行前CORS选项请求?如果是后者,就不会有尸体。可能您看到的是选项请求中的日志。您能否确认,每当日志显示
未定义时,请求方法实际上是POST而不是OPTIONS?因此,基本上,此云函数接受请求,使用它获取城市和关键字的值,然后在响应中返回响应中“listings”的值。我在函数中设置了cors头,因为它在响应中返回内容,并且在没有设置的情况下我似乎会出错。另外,如果我只在控制台上记录它,它的工作完全正常,但是如果我尝试将它分配给变量或任何东西,它会使它在控制台日志上返回未定义的状态。这很奇怪。还有一个问题是请求而不是响应,数据通过响应发送回的很好,所以我不认为这是问题所在。我注意到您正在将CORS头设置为此云函数响应的一部分。您能否澄清此云功能是否同时处理POST请求和飞行前CORS选项请求?如果是后者,就不会有尸体。可能您看到的是选项请求中的日志。您能否确认,每当日志显示未定义时,请求方法实际上是POST而不是OPTIONS?因此,基本上,此云函数接受请求,使用它获取城市和关键字的值,然后在响应中返回响应中“listings”的值。我在函数中设置了cors头,因为它在响应中返回内容,并且在没有设置的情况下我似乎会出错。另外,如果我只在控制台上记录它,它的工作完全正常,但是如果我尝试将它分配给变量或任何东西,它会使它在控制台日志上返回未定义的状态。这很奇怪,而且是有问题的请求而不是响应,数据通过响应发送回的很好,所以我不认为这是问题所在。