- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Angular 5 中有一个项目,我正在尝试使用 Google gapi.auth2 库实现登录。我被这个错误困住了:
ERROR in ./src/app/signin.service.ts
Module not found: Error: Can't resolve 'gapi.auth2' in 'C:\Users\Javier\workspace\angular-tour-of-heroes\src\app'
错误似乎与我在服务中导入库的方式有关。
我的实现包括通过 npm install --save @types/gapi.auth2
"@types/gapi.auth2": "0.0.47",
添加到 package.json 文件。将 import gapi.auth2
添加到 signin.service.ts,这是我尝试从中调用 gapi 的 Angular 服务。
包.json
{
"name": "angular-tour-of-heroes",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve --proxy-config proxy.conf.json",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^5.2.5",
"@angular/cdk": "^5.2.1",
"@angular/common": "^5.2.5",
"@angular/compiler": "^5.2.5",
"@angular/core": "^5.2.5",
"@angular/forms": "^5.2.5",
"@angular/http": "^5.2.5",
"@angular/material": "^5.2.1",
"@angular/platform-browser": "^5.2.5",
"@angular/platform-browser-dynamic": "^5.2.5",
"@angular/router": "^5.2.5",
"@types/gapi.auth2": "0.0.47",
"angular-in-memory-web-api": "^0.5.2",
"core-js": "^2.4.1",
"rxjs": "^5.5.2",
"zone.js": "^0.8.14"
},
"devDependencies": {
"@angular/cli": "1.6.3",
"@angular/compiler-cli": "^5.2.5",
"@angular/language-service": "^5.2.5",
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "^4.0.1",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",
"karma": "~1.7.0",
"karma-chrome-launcher": "~2.1.1",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.1.2",
"ts-node": "~3.2.0",
"tslint": "~5.7.0",
"typescript": "~2.4.2"
}
}
登录服务.ts:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams } from "@angular/common/http";
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { catchError, map, tap, mergeMap } from 'rxjs/operators';
import "gapi.auth2";
import { MessageService } from "./message.service";
import { Profile } from './profile';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};
@Injectable()
export class SigninService {
private signinUrl = 'api/login/google'; // URL to web api
constructor(
private http: HttpClient,
private messageService: MessageService) {
gapi.load('auth2', () => {
gapi.auth2.init({
client_id: '204566820246-67tser74gtv78uiaskm945enn5b5agl2.apps.googleusercontent.com',
scope: 'profile email'
});
});
}
public signIn(): Observable<Profile> {
return this.http.get<Profile>('/api/user').pipe(
catchError(_ => {return this.signInGoogle()})
)
}
signInGoogle(): Observable<Profile> {
var auth2 = gapi.auth2.getAuthInstance();
return fromPromise(auth2.grantOfflineAccess()).pipe(
mergeMap((resp: any) => { return this.signInBackEnd(resp.code);})
);
}
private signInBackEnd(code: string): Observable<Profile> {
let params = new HttpParams()
.append('code', code)
.append('redirect_uri', 'http://localhost:4200');
return this.http.get<Profile>(this.signinUrl, {params: params}).pipe(
mergeMap<any, Profile>(_ => {return this.http.get<Profile>('/api/user')}),
tap(_ => this.log(`singin success`)),
catchError(this.handleError<Profile>('signin'))
);
}
public signOut(): Observable<Profile> {
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
console.log('User signed out.');
});
return this.http.get<Profile>('/api/logout').pipe(
tap(_ => this.log(`sign out success`)),
catchError(this.handleError<Profile>('signout'))
);
}
/**
* Handle Http operation that failed.
* Let the app continue.
* @param operation - name of the operation that failed
* @param result - optional value to return as the observable result
*/
private handleError<T> (operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
// TODO: send the error to remote logging infrastructure
console.error(error); // log to console instead
// TODO: better job of transforming error for user consumption
this.log(`${operation} failed: ${error.message}`);
// Let the app keep running by returning an empty result.
return of(result as T);
};
}
/** Log a HeroService message with the MessageService */
private log(message: string) {
this.messageService.add('HeroService: ' + message);
}
}
索引.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="google-signin-client_id" content="204566820246-67tser74gtv78uiaskm945enn5b5agl2.apps.googleusercontent.com">
<title>AngularTourOfHeroes</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<script src="https://apis.google.com/js/platform.js"></script>
</head>
<body>
<app-root></app-root>
</body>
</html>
完整错误可以在travis中看到:
https://travis-ci.org/javiersvg/angular-tour-of-heroes/builds/345909136
或者从这里克隆 repo:
https://github.com/javiersvg/angular-tour-of-heroes/tree/google-signin
并运行 npm start
。
你能帮我弄清楚我做错了什么吗?
非常感谢。
最佳答案
好的,解决问题的方法是将 gapi.auth2 添加到 tsconfig.app.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"baseUrl": "./",
"module": "es2015",
"types": ["gapi.auth2"]
},
"exclude": [
"test.ts",
"**/*.spec.ts"
]
}
您可以在此处看到正在运行的构建: https://travis-ci.org/javiersvg/angular-tour-of-heroes/builds/354845829
非常感谢
关于Angular 5 import Google gapi witn @types/gapi.auth2 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48973621/
我需要跨多个帐户连接到多个 Google 议程以获取事件。为每个要连接的议程调用以下函数,它适用于第一个查询的帐户,之后我收到上述错误。我怎样才能连接到下一个帐户,身份验证是否需要断开连接或取消设置?
在 Google 的 JavaScript API 中,gapi.load() 和 gapi.client.load() 之间有什么区别?它们之间的互换性如何?我什么时候应该使用其中一个而不是另一个?
我在 Angular 5 中有一个项目,我正在尝试使用 Google gapi.auth2 库实现登录。我被这个错误困住了: ERROR in ./src/app/signin.service.ts
我正在尝试了解如何最好地使用客户端 Javascript 访问 Google 云端硬盘。我写了一些测试代码来插入一个只有元数据的新文件。我找到了一个使用此代码的示例: var request = ga
Exception: GAPI: Failed to request account data. Error: " Error 404 (Not Found)!!1 * {
我根据谷歌文档在页面加载时运行此代码: (function() { var po = document.createElement('script'); po.type = 'text/jav
我很难将 Google javascript api 加载到我的 chrome 扩展程序中。请注意我是 javascript 的新手,甚至是 chrome 扩展的新手。 我有一个执行脚本的 backg
我正在尝试将图像上传到谷歌驱动器。我按照本教程上传文件,我可以上传一个简单的文件,但是当我尝试上传图像时,我得到了损坏的图像。事实上,文件已上传,但我要查看的图像已损坏。我知道问题出在请求的正文中,但
很抱歉,这个话题复活了,但是我也有同样的疑问。 我使用的是gapi,目前“ 2013年10月23日”,谷歌更改了如何获取数据。我无法获得全部访问。 我只需要访问我的网站的总次数,仅此而已。 这是我正在
我正在尝试使用 gapi php 类从分析中获取基本统计信息。我只需要过去 30 天的数据,没有特定维度。这与查看没有分割的分析相同。我从这个开始: $ga->requestReportData($a
我正在使用 GAPI 尝试根据 Google Analytics(分析)数据创建简单的报告。我的内部客户希望看到每页有 2 个字段的概述:综合浏览量和唯一访问者。我的综合浏览量部分可以工作,但我无法让
我做了下面的测试,但是结果不是很好,因为我希望GAPI能有很大的提高。不知道是不是我做错了,希望大家帮我指正,万分感谢! My test environment are OpenCV4.2 offic
从我的 HTML 代码访问 Google+ API 时,我看到了 ReferenceError:gapi is not defined 错误。 我的代码很简单,但不确定它有什么问题。 如有任何意见,我
我正在尝试使用 Google Sheets API 将其包含在我的网络应用程序中,但我一直收到一条错误消息,指出未定义 gapi 库。我尝试使用 ComponentDidMount 生命周期方法延迟对
请遵循以下指示:https://developers.google.com/+/web/api/javascript (function() { var po = document.cr
我目前正在多个位置使用应用调用 gapi.signIn 方法。 当用户登录时 当用户注册时 当用户想要将其应用帐户关联到 Google 帐户时 因此,在每个实例中都会使用不同的回调参数调用 gapi.
我已经投入到一个旨在利用 YouTube API 的小项目中。我已经准备好一些基本代码,我最初认为这些代码可以正常工作。 使用 Chrome,我可以通过我自己网络上的多台机器登录,使用下面的源代码没有
需要在js中进行auth请求,但浏览器不支持弹窗。有什么方法可以重定向到新的 url 或在应用程序的 html5 页面中显示请求 最佳答案 通过使用此代码检查用户是否授权您的应用 gapi.auth.
我有一个基于类的组件,它使用 gapi (Google Auth) API 呈现一个按钮并且它可以工作: import React from 'react'; class GoogleAuth ext
我是 vue 的新手,一直试图在我的网页中包含一个谷歌登录按钮。但是,在我的mounted() 中有一个错误指出“gapi 未定义”。我该如何解决?我也尝试过初始化 gapi,但我不知道该放在哪里。
我是一名优秀的程序员,十分优秀!