Я довольно новичок в android студии и FireBase. Недавно я пытался создать приложение. Пользователи этого приложения должны иметь возможность войти в одну и ту же учетную запись на нескольких android устройствах. Я планирую отправлять уведомления пользователю всякий раз, когда появляется новый запрос. Для отображения уведомлений на всех этих устройствах я использую функции Firebase с Node js. Однако даже после ознакомления со справочной документацией, доступной в Firebase и некоторыми учебными пособиями, я не смог правильно закодировать файл index. js, чтобы запустить эту функцию. Я продолжаю получать ошибки, о которых я упоминал ниже.
Это код, который я использовал в своем индексе. js file,
'use strict'
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification = functions.database.ref('/notifications/{user_id}/{notification_id}').onWrite((data, context) => {
const user_id = context.params.user_id;
const notification = context.params.notification;
console.log('We have a notification to send: ',context.params.user_id);
if(!event.data.val()){
return console.log('A Notification has been deleted from the database', notification_id);
}
var query = admin.database().ref(`/Users/${user_id}/device_token`).orderByKey();
query.once("value")
.then(function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var key = childSnapshot.key;
return true;
});
});
});
Вот так выглядит моя база данных для хранения token_id,
Наконец, это код, который я использовал для добавления друзей (точнее, в моем приложении).
package com.example.eguru_std;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.renderscript.Sampler;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Objects;
public class ProfileActivity extends AppCompatActivity {
private TextView mDisplayID;
private TextView mProfileName, mProfileLang;
private Button mProfileSendReqBtn;
private DatabaseReference mUsersDatabase;
private ProgressDialog mProgressDialog;
private String mCurrent_state;
private DatabaseReference mFriendReqDatatbase;
private DatabaseReference mFriendDatabase;
private FirebaseUser mCurrent_user;
private DatabaseReference mNotificationDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
final String user_id = getIntent().getStringExtra("user_id");
assert user_id != null;
mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(user_id);
mFriendReqDatatbase = FirebaseDatabase.getInstance().getReference().child("Friend_req");
mFriendDatabase = FirebaseDatabase.getInstance().getReference().child("Friends");
mNotificationDatabase = FirebaseDatabase.getInstance().getReference().child("notifications");
mCurrent_user = FirebaseAuth.getInstance().getCurrentUser();
mProfileName = (TextView) findViewById(R.id.profile_displayName);
mProfileLang = (TextView) findViewById(R.id.profile_lang);
mProfileSendReqBtn = (Button) findViewById(R.id.profile_send_req_btn);
mCurrent_state = "not_friends";
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle("Loading User Data");
mProgressDialog.setMessage("Please Wait");
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.show();
mUsersDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String display_name = Objects.requireNonNull(dataSnapshot.child("Name").getValue()).toString();
String languages = Objects.requireNonNull(dataSnapshot.child("Languages").getValue()).toString();
mProfileName.setText(display_name);
mProfileLang.setText(languages);
//============FRIENDS LIST/ REQUEST FEATURE===============//
mFriendReqDatatbase.child(mCurrent_user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild(user_id)){
String req_type = dataSnapshot.child(user_id).child("request_type").getValue().toString();
if(req_type.equals("recieved")){
mCurrent_state = "req_recieved";
mProfileSendReqBtn.setText("Accept Request");
}
else if(req_type.equals("sent")){
mCurrent_state = "req_sent";
mProfileSendReqBtn.setText("Decline Request ");
}
mProgressDialog.dismiss();
} else{
mFriendDatabase.child(mCurrent_user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild(user_id)){
mCurrent_state = "friends";
mProfileSendReqBtn.setText("Remove Subject");
}
mProgressDialog.dismiss();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
mProgressDialog.dismiss();
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mProfileSendReqBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mProfileSendReqBtn.setEnabled(false);
if(mCurrent_state.equals("not_friends")){
mFriendReqDatatbase.child(mCurrent_user.getUid()).child(user_id).child("request_type")
.setValue("sent").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
mFriendReqDatatbase.child(user_id).child(mCurrent_user.getUid()).child("request_type")
.setValue("recieved").addOnSuccessListener(new OnSuccessListener<Void>() {
@SuppressLint("SetTextI18n")
@Override
public void onSuccess(Void aVoid) {
HashMap<String, String> notificationData = new HashMap<>();
notificationData.put("from", mCurrent_user.getUid());
notificationData.put("type", "request");
mNotificationDatabase.child(user_id).push().setValue(notificationData).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mCurrent_state = "req_sent";
mProfileSendReqBtn.setText("Remove Subject");
}
});
Toast.makeText(ProfileActivity.this, "Request Sent", Toast.LENGTH_SHORT).show();
}
});
}
else{
Toast.makeText(ProfileActivity.this, "Failed Adding Subject", Toast.LENGTH_SHORT).show();
}
mProfileSendReqBtn.setEnabled(true);
}
});
}
//================Remove Subject==================//
if(mCurrent_state.equals("req_sent")){
mFriendReqDatatbase.child(mCurrent_user.getUid()).child(user_id).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mFriendReqDatatbase.child(user_id).child(mCurrent_user.getUid()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mProfileSendReqBtn.setEnabled(true);
mCurrent_state = "not_friends";
mProfileSendReqBtn.setText("Add Subject");
}
});
}
});
}
///==============Request recieved state===============//
if(mCurrent_state.equals("req_recieved")){
final String currentDate = DateFormat.getDateTimeInstance().format(new Date());
mFriendDatabase.child(mCurrent_user.getUid()).child(user_id).setValue(currentDate).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mFriendDatabase.child(user_id).child(mCurrent_user.getUid()).setValue(currentDate)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mFriendReqDatatbase.child(mCurrent_user.getUid()).child(user_id).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mFriendReqDatatbase.child(user_id).child(mCurrent_user.getUid()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mProfileSendReqBtn.setEnabled(true);
mCurrent_state = "friends";
mProfileSendReqBtn.setText("Remove Subject");
}
});
}
});
}
});
}
});
}
}
});
}
}
Ошибки, которые я получаю при попытке развернуть, следующие: ,
i развертывание функций Выполнение команды: npm --префикс "$ RESOURCE_DIR" run lint
functions @ lint C: \ Users \ user \ Desktop \ eGuru \ messagesFunction \ functions eslint.
C: \ Users \ пользователь \ Desktop \ eGuru \ventFunction \ functions \ index. js
9: 121 предупреждение Ожидается, что будет возвращено значение в конце стрелки функция непротиворечивая-22: 1 ошибка ожидается c atch () или возвращать обещание / ловить или возвращать 23: 9
предупреждение Неожиданное выражение функции
Предпочитать-стрелка-обратный вызов 23: 9 Ошибка Каждый оператор then () должен возвращать значение или генерировать обещание / всегда возвращаемый результат 24 : 22 предупреждение Неожиданное выражение функции
предпочитать-обратный вызов стрелки
✖ 5 проблем (2 ошибки, 3 предупреждения) 0 ошибок и 2 предупреждения, которые потенциально можно исправить с помощью опции --fix
.
npm ОШИБКА! код ELIFECYCLE npm ОШИБКА! errno 1 npm ERR! functions @ lint: eslint .
npm ERR! Статус выхода 1 npm ERR! npm ОШИБКА! Сбой в скрипте functions @ lint. npm ОШИБКА! Это, вероятно, не проблема с npm. Скорее всего, выше вывод журнала.
npm ОШИБКА! Полный журнал этого прогона можно найти в: npm ERR!
C: \ Users \ user \ AppData \ Roaming \ npm -cache_logs \ 2020-05-01T13_25_19_389Z-debug.log events. js: 287 бросок эр; // Необработанное событие 'error' ^
Ошибка: spawn npm --prefix "% RESOURCE_DIR%" run lint ENOENT at notFoundError (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase-tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 6: 26) в verifyENOENT (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase -tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 40: 16) в ChildProcess.cp.emit (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase-tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 27: 25) в Process.ChildProcess._handle.onexit (внутренний / дочерний_процесс. js: 275: 12) Произошло событие «ошибка» в экземпляре ChildProcess по адресу: в ChildProcess.cp.emit (C: \ Users \ user \ AppData \ Roaming \ npm \ node_modules \ firebase-tools \ node_modules \ cross-env \ node_modules \ cross-spawn \ lib \ enoent. js: 30: 37) в Process.ChildProcess._handle.onexit (internal / child_process. js: 275: 12) {code: 'ENOENT', errno: 'ENOENT', syscall: 's pawn npm --prefix "% RESOURCE_DIR%" run lint ',
path:' npm --prefix "% RESOURCE_DIR%" run lint ', spawnargs: []}
Ошибка: функции предустановленной ошибки: команда завершена с ненулевым кодом выхода1
Я пробовал разные варианты с индексом. js код и не знаю, как мне решить эту проблему. Пожалуйста, укажите я в правильном направлении. Заранее спасибо