javascript - 节点js ajax上缺少谷歌翻译键
问题描述
我有一个简单的 Node JS 脚本,在终端本地运行时可以正常工作:
exports.google_translate = function (translate_text, res) {
var Translate = require('@google-cloud/translate');
var translate = new Translate.Translate({projectId: 'my project'});
translate.translate(translate_text, 'fr').then(results => {
var translation = results[0];
res.send(translation);
}).catch(err => {
res.send('ERROR:', err);
});
}
但是,每当我通过 Ajax 调用它时,都会收到以下错误:
Error: The request is missing a valid API key.
我已经使用它添加了这个作为永久环境变量:
export GOOGLE_APPLICATION_CREDENTIALS="[PATH to key downloaded]"
但是每次我通过 Ajax 调用这个脚本时,我都会得到同样的错误。所以我的问题是,如何让 Node JS 脚本保存 API 密钥,以便在通过 Ajax 调用时工作?
谢谢
解决方案
似乎无论出于何种原因,应用程序都无法正确读取环境变量。由于 nodejs 将所有环境变量存储在中,因此process.env
您可以通过调用来确保它是编写的:
function google_translate(translate_text) {
process.env.GOOGLE_APPLICATION_CREDENTIALS = "[PATH to key downloaded]";
return translate.translate(translate_text, 'fr')
.then(console.log)
.catch(console.error);
}
或将密钥直接传递给构造函数
const translate = new Translate.Translate({
projectId: 'my-project',
keyFilename: "[PATH to key downloaded]"
});
您还可以确保最终读取密钥文件并将配置传递给翻译构造函数
const translate = new Translate.Translate({
credentials: JSON.parse(fs.readFileSync("[PATH to key downloaded]", "utf8"))
});
如果仍然没有帮助,可能是密钥本身的问题,您可以尝试在此处生成一个新密钥https://console.cloud.google.com/apis/credentials
推荐阅读
- reactjs - react native right tick animation on success
- java - BitTorrent,DHT,BEP42,计算我的 NodeId
- java - 字符串太大,无法使用 UTF-8 进行编码,而是写为“STRING_TOO_LARGE”
- typescript - Angular6错误:未捕获(承诺):TypeError:(中间值).map不是函数
- ios - 在不更改 BundleId 的情况下辞职 iOS 应用程序 .iPA 文件
- svg - 自定义标记的 SVG 折线
- javascript - 如何从 VueJs 中的 body 获取参数值?
- sql - 将两个不同查询的结果相加
- html - sqPaymentForm 不适用于 IOS 自动填充
- codenameone - 应用停止/恢复后将代号一组件保持在无效位置