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
      }
    }
  );

});

如果您想知道如何使用 clientIdsecret,请前往 Google API 控制台 here,创建一个新项目,然后进行配置相应的凭据和 OAuth 同意屏幕。