Meteor 的 ServiceConfiguration 在 Meteor Reset 后中断
Meteor's ServiceConfiguration broken after Meteor Reset
这个错误发生在我 运行 meteor reset
我的项目
之后
Uncaught TypeError: Cannot read property 'findOne' of undefined
at onLoginWithGoogle (Heading.js:23)
at Button._this.handleClick (modules.js?hash=aa2df6fbe7f4a6a52d262a213d0cfff2a56dcdc2:10098)
at HTMLUnknownElement.callCallback (modules.js?hash=aa2df6fbe7f4a6a52d262a213d0cfff2a56dcdc2:32249)
...
这是调用 ServiceConfiguration 的文件:
Heading.js
import React, { useContext, useState } from 'react'
import { Meteor } from 'meteor/meteor';
import ServiceConfiguration from 'meteor/service-configuration'
...
function Heading(props){
const context = useContext(Context);
const [error, setError] = useState('');
const onLoginWithGoogle = () => {
const {scope} = ServiceConfiguration.configurations.findOne({service: 'google'}); //this is where it failed
Meteor.loginWithGoogle(
{requestPermissions: scope, requestOfflineToken: true },
error => {
if (error) {
if (error.errorType === 'Accounts.LoginCancelledError') return;
alert('Login error', error);
} else {
//
}
}
);
};
}
//export
服务配置存储在 service-configuration.js
文件下的 server
文件夹中:
import { ServiceConfiguration } from 'meteor/service-configuration';
ServiceConfiguration.configurations.update(
{ service: 'google' },
{
$set: {
clientId: 'XXX',
loginStyle: 'popup',
secret: 'XXXX'
}
}
);
我无法理解这个错误。它在我 运行 meteor reset
.
之前工作
我已经弄明白了。回答这个问题是为了帮助将来也可能遇到这个问题的其他人。
因为我做了 meteor reset
,项目被重置为 0
。所以我需要将服务配置详细信息重新插入到 mongo 集合 meteor_accounts_loginServiceConfiguration
中...我想我不知何故不小心删除了 server/main.js
文件中的 upsert 命令。所以在我完成 meteor reset
之后,服务配置是空的,并且 Meteor.startup()
中没有代码来补充所需的详细信息。
这是应该保留在 server/main.js
中的代码:
Meteor.startup(() => {
// first, remove configuration entry in case service is already configured
Accounts.loginServiceConfiguration.remove({
service: "google"
});
Accounts.loginServiceConfiguration.upsert(
{ service: 'google' },
{
$set: {
clientId: 'XXX', // change this to your actual clientId
loginStyle: 'popup',
secret: 'XXX' //change this to your actual secret
}
}
);
});
如果您想知道如何使用 clientId
和 secret
,请前往 Google API 控制台 here,创建一个新项目,然后进行配置相应的凭据和 OAuth 同意屏幕。
这个错误发生在我 运行 meteor reset
我的项目
Uncaught TypeError: Cannot read property 'findOne' of undefined
at onLoginWithGoogle (Heading.js:23)
at Button._this.handleClick (modules.js?hash=aa2df6fbe7f4a6a52d262a213d0cfff2a56dcdc2:10098)
at HTMLUnknownElement.callCallback (modules.js?hash=aa2df6fbe7f4a6a52d262a213d0cfff2a56dcdc2:32249)
...
这是调用 ServiceConfiguration 的文件:
Heading.js
import React, { useContext, useState } from 'react'
import { Meteor } from 'meteor/meteor';
import ServiceConfiguration from 'meteor/service-configuration'
...
function Heading(props){
const context = useContext(Context);
const [error, setError] = useState('');
const onLoginWithGoogle = () => {
const {scope} = ServiceConfiguration.configurations.findOne({service: 'google'}); //this is where it failed
Meteor.loginWithGoogle(
{requestPermissions: scope, requestOfflineToken: true },
error => {
if (error) {
if (error.errorType === 'Accounts.LoginCancelledError') return;
alert('Login error', error);
} else {
//
}
}
);
};
}
//export
服务配置存储在 service-configuration.js
文件下的 server
文件夹中:
import { ServiceConfiguration } from 'meteor/service-configuration';
ServiceConfiguration.configurations.update(
{ service: 'google' },
{
$set: {
clientId: 'XXX',
loginStyle: 'popup',
secret: 'XXXX'
}
}
);
我无法理解这个错误。它在我 运行 meteor reset
.
我已经弄明白了。回答这个问题是为了帮助将来也可能遇到这个问题的其他人。
因为我做了 meteor reset
,项目被重置为 0
。所以我需要将服务配置详细信息重新插入到 mongo 集合 meteor_accounts_loginServiceConfiguration
中...我想我不知何故不小心删除了 server/main.js
文件中的 upsert 命令。所以在我完成 meteor reset
之后,服务配置是空的,并且 Meteor.startup()
中没有代码来补充所需的详细信息。
这是应该保留在 server/main.js
中的代码:
Meteor.startup(() => {
// first, remove configuration entry in case service is already configured
Accounts.loginServiceConfiguration.remove({
service: "google"
});
Accounts.loginServiceConfiguration.upsert(
{ service: 'google' },
{
$set: {
clientId: 'XXX', // change this to your actual clientId
loginStyle: 'popup',
secret: 'XXX' //change this to your actual secret
}
}
);
});
如果您想知道如何使用 clientId
和 secret
,请前往 Google API 控制台 here,创建一个新项目,然后进行配置相应的凭据和 OAuth 同意屏幕。