#firebase #google-cloud-functions
#firebase #google-cloud-функции
Вопрос:
Действительно новичок в firebase и очень младший уровень кода. Я пытаюсь выяснить ошибку, из-за которой пользовательский 404 не отображается, или при изменении перезаписи приложение не работает.
"rewrites": [
{
"source": "**",
"function": "app"
}
]
Это перенаправляет все в приложение, и приложение работает должным образом. Однако 404.html не отображается при попытке использования неверного URL-адреса. Существует общий «Не удается ПОЛУЧИТЬ / asdfasd»
Изменил его на
"rewrites": [
{
"source": "/",
"function": "app"
}
]
Теперь будет отображаться пользовательский 404.html правильно.
Однако при этом функция отвечает 404 с этой конфигурацией, прерывая работу приложения. Из functions/index.js:
app.post('/sendsmstoconsumer', (request, response) => {
client.messages
.create({body: request.body.message, from: ' 15555555555', to: request.body.phone})
.then(message => {
response.send("Your message: " request.body.message " has been sent!")
});
})
Я пробовал несколько вариантов, как показано ниже, но я просто что-то упускаю.
{
"source": "/",
"function": "app"
},
{
"source": "/sendsmstoconsumer",
"function": "sms"
}
]
изменить functions/index.js:
exports.sms = functions.httpsOnRequest((request, response) => {
client.messages
.create({body: request.body.message, from: ' 15555555555', to: request.body.phone})
.then(message => {
response.send("Your message: " request.body.message " has been sent!")
});
})
Я был бы признателен за любую помощь в правильном структурировании перезаписи или изменении функции, как пользовательский 404, так и приложение работают должным образом. Кажется, я застрял с получением либо одного, либо другого.
Спасибо.
По запросу редактирование для добавления полных файлов:
firebase.json
{
"database": {
"rules": "database.rules.json"
},
"hosting": {
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"function": "app"
}
]
},
"emulators": {
"functions": {
"port": 5001
},
"database": {
"port": 9000
},
"hosting": {
"port": 5000
},
"ui": {
"enabled": true
}
}
}
index.js
const functions = require('firebase-functions')
const express = require('express')
const app = express()
const accountSid = 'xxx'
const authToken = 'xxx'
const client = require('twilio')(accountSid, authToken)
const cors = require('cors')
// Enable cors for everything
// TODO: Re-enable cors at a later date
// src: https://www.npmjs.com/package/cors
app.use(cors())
app.post('/sendsmsverificationmessage', (request, response) => {
client.verify.services('xxx')
.verifications
.create({to: request.body.phone, channel: 'sms'})
.then(verification => {
response.send("Your verification code has been sent to your phone!" )
});
})
app.post('/verifyusersphonenumber', (request, response) => {
client.verify.services('xxx')
.verificationChecks
.create({to: request.body.phone, code: request.body.token})
.then(verification_check => {
response.send("Your phone has been verified!")
});
})
app.post('/sendsmstoconsumer', (request, response) => {
client.messages
.create({body: request.body.message, from: ' 15555555555', to: request.body.phone})
.then(message => {
response.send("Your message: " request.body.message " has been sent!")
});
})
exports.app = functions.https.onRequest(app)
Комментарии:
1. Как вы делаете запрос к функции? Пожалуйста, отредактируйте вопрос, чтобы показать весь код от начала до конца.
2. @DougStevenson я добавил в соответствии с просьбой. Запрос функции отправляется через POST в //my.web.app/sendsmstocustomer, который работает с файлами, как добавлено выше, но 404.html не подается.
Ответ №1:
По умолчанию перезапись не «проваливается» после сопоставления, поэтому ответ, отправленный облачной функцией, всегда будет возвращаться непосредственно пользователю. На самом деле есть способ обойти это: если тело вашего ответа содержит заголовок X-Cascade: PASS
.
В этом случае хостинг Firebase перейдет к поведению 404 по умолчанию (включая пользовательский 404.html ). Вы должны иметь возможность добавить это в свое экспресс-приложение следующим образом:
// *AFTER* all other endpoints
app.use((req, res) => {
res.set('X-Cascade', 'PASS');
res.status(404).send('Not Found');
});
Комментарии:
1. @Mihael-Bleigh Я пробовал это, вставляя до и после exports.app (я добавил весь код в другой комментарий), но это не сработало ни в одном случае. Спасибо.
2. Здравствуйте, я попробовал, чтобы он работал на локальном хосте, но не работает в развернутой версии
Ответ №2:
Благодаря ответу Майкла Блейга мы нашли решение, но должны были указать 404.html досье.
app.use((req, res) => {
res.set('X-Cascade', 'PASS')
res.status(404).redirect('404.html')
})