【发布时间】:2019-03-31 06:44:59
【问题描述】:
我正在尝试浏览 Angular 组件(注册和仪表板)。如果用户已经注册,那么他应该被重定向到仪表板组件,如果没有,那么他应该被重定向到注册组件。仅运行 lib.js 文件作为服务器。使用ng build 命令(使用dist 文件夹)后部署角度文件。前端和后端都在同一个文件夹中
这里是一些代码sn-ps:
lib.js(node.js 后端文件)
app.use(exp.static(path.join(__dirname, 'dist')));
app.listen(PORT, function() {
console.log('Express server listening on port ', PORT); // eslint-disable-line
});
app.post('/check_account',function(req,res){
console.log(req.body);
connection.query('SELECT * FROM login_table WHERE m_pub_key LIKE '+'\"'+req.body.m_pub_key+'\"' ,function(error,rows,fields){
if(!!error){
console.log('error!');
res.send('Error!');
}
else
{
console.log(rows);
if(rows.length!=0){
data={
is_signed_up: 1
}
res.send(data);
}
else{
data={
is_signed_up: 0
}
res.send(data);
}
}
});
});
app.get('/dashboard',function(req,res){
console.log("inside dashboard backend");
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.get('/signup', function (req,res) {
console.log("signup backend");
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.get('/', function (req,res) {
console.log("slash backend");
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.component.ts
constructor(private router: Router,private _appService: AppService, private zone: NgZone, private http: HttpClient, private route: ActivatedRoute){
console.log("inside app component constructor");
this.checkAndInstantiateWeb3();
this.onReady();
}
checkAccount(){
let data_send = JSON.stringify({
'm_pub_key': this.m_pub_key
});
this.zone.runOutsideAngular(()=>{
this._appService.post_method(this.url+"check_account", data_send).subscribe(
data => {
this.is_signed_up=data["is_signed_up"];
console.log(this.is_signed_up+"***************8");
if(this.is_signed_up==1){
console.log("navigating to dash");
this.router.navigate(['/dashboard']);
//this.http.get("/dashboard");
}
else{
console.log("navigating to signuo");
this.router.navigate(['/signup']);
//this.http.get("/signup");
}
},
error => {
// console.log('post error');
});
});
}
public checkAndInstantiateWeb3 = () => {
if (typeof window.web3 !== 'undefined') {
console.warn('Using injected web3');
this.web3 = new Web3(window.web3.currentProvider);
} else {
// when running in browser, use incognito mode or log out of metamask
console.warn('No web 3 detected, falling back to Ganache');
this.provider = new Web3.providers.HttpProvider('http://localhost:7545');
this.web3 = new Web3(this.provider);
}
window.ethereum.enable();
}
public onReady = () => {
// get initial account balance so it can be displayed
this.web3.eth.getAccounts((err, accs) => {
if (err != null) {
console.log(err);
alert('There was an error fetching your accounts.');
return;
}
if (accs.length === 0) {
alert('You are not connected to an Ethereum client.');
return;
}
this.m_pub_key=accs[0];
console.log(this.m_pub_key);
this.checkAccount();
});
}
}
app-routing.module.ts
const routes: Routes = [
{ path: 'signup', component: SignupComponent },
{ path: '', pathMatch: 'full', redirectTo: 'signup' },
{ path: 'dashboard', component: DashboardComponent },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule { }
现在的问题是,如果用户已经注册,然后当他尝试转到任何页面时,他会被重定向到第一个注册页面,然后是仪表板页面,但是两个页面重叠并且仪表板组件也不起作用适当地。当用户使用 url 直接访问仪表板组件时,仪表板组件将按预期工作。对此问题的任何帮助将不胜感激。
编辑 1
按照“k0hamed”给出的答案。
像这样使用 canActivate 属性{ path: 'signup', component: SignupComponent, canActivate:[AuthGuard] }
这是我创建的保护和服务文件,它没有按预期工作。 auth.guard.ts 文件中的val 没有更改,当我转到 localhost:8080/ 或 localhost:8080/signup 时没有加载任何内容,但是当我输入 localhost:8080/dashboard 时会加载仪表板组件
auth.guard.ts:
export class AuthGuard implements CanActivate {
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
console.log('AuthGuard#canActivate called');
return this.signupService.onReady()
.pipe(tap(val=>!val && this.router.navigate(['/signup'])));
}
constructor(private signupService: AuthService, private router: Router) {}
}
auth.service.ts:
export class AuthService {
provider: any;
account: any;
accounts: any;
web3: any;
m_pub_key="";
title = 'project2';
is_signed_up:any;
url = "http://localhost:8080/";
val = of(false);
constructor(private _appService: AppService, private zone: NgZone, private router: Router){
}
onReady():Observable<boolean> {
// get initial account balance so it can be displayed
// (async () => {
if (typeof window.web3 !== 'undefined') {
console.warn('Using injected web3');
this.web3 = new Web3(window.web3.currentProvider);
} else {
// when running in browser, use incognito mode or log out of metamask
console.warn('No web 3 detected, falling back to Ganache');
this.provider = new Web3.providers.HttpProvider('http://localhost:7545');
this.web3 = new Web3(this.provider);
}
window.ethereum.enable();
this.web3.eth.getAccounts((err, accs) => {
if (err != null) {
console.log(err);
alert('There was an error fetching your accounts.');
return;
}
if (accs.length === 0) {
alert('You are not connected to an Ethereum client.');
return;
}
this.m_pub_key=accs[0];
console.log(this.m_pub_key);
// this.isSigned();
});
let data_send = JSON.stringify({
'm_pub_key': this.m_pub_key
});
this._appService.post_method(this.url+"check_account", data_send).subscribe(
data => {
this.is_signed_up=data["is_signed_up"];
console.log(this.is_signed_up+"***************8");
if(this.is_signed_up==1){
console.log("navigating to dash");
//this.router.navigate(['/dashboard']);
//this.http.get("/dashboard");
this.val = of(false);
// this.router.navigate(['/dashboard']);
}
else{
console.log("navigating to signup");
//this.router.navigate(['/signup']);
//this.http.get("/signup");
this.val = of(true);
// this.router.navigate(['/signup']);
}
console.log(this.val);
},
// console.log(this.val);
error => {
// console.log('post error');
});
// });
console.log(this.val);
return this.val
}
}
【问题讨论】:
标签: node.js angular angular2-routing