प्रतिक्रिया - एक फायरस्टार टाइमस्टैम्प प्रदर्शित करें


10

मैं यह जानने की कोशिश कर रहा हूं कि रिएक्शन ऐप में फायरस्टार टाइमस्टैम्प को कैसे प्रदर्शित किया जाए।

मेरे पास एक फायरस्टार डॉक्यूमेंट है, जिसका नाम createAt है।

मैं इसे आउटपुट की सूची में शामिल करने की कोशिश कर रहा हूं (प्रासंगिक बिट्स को यहां हटा रहा हूं ताकि आपको फ़ील्ड की पूरी सूची के माध्यम से पढ़ना न पड़े)।

componentDidMount() {
    this.setState({ loading: true });

    this.unsubscribe = this.props.firebase
      .users()
      .onSnapshot(snapshot => {
        let users = [];

        snapshot.forEach(doc =>
          users.push({ ...doc.data(), uid: doc.id }),
        );

        this.setState({
          users,
          loading: false,
        });
      });
  }

  componentWillUnmount() {
    this.unsubscribe();
  }

  render() {
    const { users, loading } = this.state;

    return (
        <div>
    {loading && <div>Loading ...</div>}

            {users.map(user => (

                <Paragraph key={user.uid}>  

       <key={user.uid}>  
       {user.email}
       {user.name}
       {user.createdAt.toDate()}
       {user.createdAt.toDate}
       {user.createdAt.toDate()).toDateString()}

एकमात्र विशेषता जो रेंडर नहीं करेगी वह तारीख है।

उपरोक्त प्रत्येक प्रयास में एक त्रुटि उत्पन्न होती है जो कहती है:

TypeError: अपरिभाषित की संपत्ति 'toate' नहीं पढ़ सकता है

मैंने इस पोस्ट को , और इस पोस्ट और इस पोस्ट को , और इस पोस्ट को और उन जैसे अन्य लोगों को देखा है, जो सुझाव देते हैं कि काम करना चाहिए () काम करना चाहिए। लेकिन - यह एक्सटेंशन मेरे लिए एक त्रुटि फेंकता है - जब मैं स्ट्रॉन्ग एक्सटेंशन की कोशिश करता हूं।

मुझे पता है कि फायरस्टार में कुछ है क्योंकि जब मैं user.createdAt की कोशिश करता हूं, तो मुझे यह कहते हुए एक त्रुटि मिलती है कि इसमें सेकंड के साथ एक ऑब्जेक्ट मिला।

नीचे दिए गए वेलेमास से उदाहरण लेते हुए, मैंने क्षेत्र के आउटपुट को लॉग इन करने की कोशिश की:

this.db.collection('users').doc('HnH5TeCU1lUjeTqAYJ34ycjt78w22').get().then(function(doc) {
  console.log(doc.data().createdAt.toDate());

}

मैंने इसे अपने मैप स्टेटमेंट में जोड़ने की भी कोशिश की, लेकिन एक त्रुटि मिली जो कहती है कि user.get एक फ़ंक्शन नहीं है।

{user.get().then(function(doc) {
                    console.log(doc.data().createdAt.toDate());}
                  )}

यह ऊपर के समान त्रुटि संदेश उत्पन्न करता है।

यहां छवि विवरण दर्ज करें

अगले ATTEMPT

फायरस्टार में एक तारीख दर्ज करने का एक तरीका खोजने की कोशिश में एक अजीब बात सामने आई है जो मुझे इसे वापस पढ़ने की अनुमति देती है, वह यह है कि जब मैं इस फॉर्मूलेशन का उपयोग करने के लिए एक रूप में अपना सबमिट हैंडलर बदलता हूं:

handleCreate = (event) => {
    const { form } = this.formRef.props;
    form.validateFields((err, values) => {
      if (err) {
        return;
      };
    const payload = {
    name: values.name,
    // createdAt: this.fieldValue.Timestamp()
    // createdAt: this.props.firebase.fieldValue.serverTimestamp()

    }
    console.log("formvalues", payload);
    // console.log(_firebase.fieldValue.serverTimestamp());


    this.props.firebase
    .doCreateUserWithEmailAndPassword(values.email, values.password)
    .then(authUser => {
    return this.props.firebase.user(authUser.user.uid).set(
        {
          name: values.name,
          email: values.email,
          createdAt: new Date()
          // .toISOString()
          // createdAt: this.props.firebase.fieldValue.serverTimestamp()

        },
        { merge: true },
    );
    // console.log(this.props.firebase.fieldValue.serverTimestamp())
    })
    .then(() => {
      return this.props.firebase.doSendEmailVerification();
      })
    // .then(() => {message.success("Success") })
    .then(() => {
      this.setState({ ...initialValues });
      this.props.history.push(ROUTES.DASHBOARD);

    })


  });
  event.preventDefault();
    };

यह डेटाबेस में एक तारीख रिकॉर्ड करने के लिए काम करता है।

फायरस्टार प्रविष्टि का रूप इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

मैं इस घटक में एक तिथि प्रदर्शित करने का प्रयास कर रहा हूं:

class UserList extends Component {
  constructor(props) {
    super(props);

    this.state = {
      loading: false,
      users: [],
    };
  }

  componentDidMount() {
    this.setState({ loading: true });

    this.unsubscribe = this.props.firebase
      .users()
      .onSnapshot(snapshot => {
        let users = [];

        snapshot.forEach(doc =>
          users.push({ ...doc.data(), uid: doc.id }),
        );

        this.setState({
          users,
          loading: false,
        });
      });
  }

  componentWillUnmount() {
    this.unsubscribe();
  }

  render() {
    const { users, loading } = this.state;

    return (
      <div>
          {loading && <div>Loading ...</div>}

          <List
            itemLayout="horizontal"
            dataSource={users}

            renderItem={item => (
              <List.Item key={item.uid}>
                <List.Item.Meta
                  title={item.name}
                  description={item.organisation}
                />
                  {item.email}
                  {item.createdAt}
                  {item.createdAt.toDate()}
                  {item.createdAt.toDate().toISOString()}

              </List.Item>
            // )
          )}
          />

      </div>
    );
  }
}

export default withFirebase(UserList);

जब मैं इसे वापस पढ़ने की कोशिश करता हूं - उपयोग:

{} Item.email

त्रुटि संदेश पढ़ता है:

त्रुटि: ऑब्जेक्ट एक प्रतिक्रियाशील बच्चे के रूप में मान्य नहीं हैं (पाया गया: टाइमस्टैम्प (सेकंड = 1576363035, नैनोसेकंड = 52000000))। यदि आप बच्चों के संग्रह को प्रस्तुत करना चाहते हैं, तो इसके बजाय एक सरणी का उपयोग करें। आइटम में (UserIndex.jsx पर: 74)

जब मैं इनमें से प्रत्येक प्रयास का उपयोग कर रहा हूं:

{item.createdAt}
{item.createdAt.toDate()}
{item.createdAt.toDate().toISOString()}

मुझे एक त्रुटि मिलती है जो कहती है:

TypeError: अपरिभाषित की संपत्ति 'toate' नहीं पढ़ सकता है

अन्य क्षेत्रों में एक ही दस्तावेज़ में लॉग की गई प्रविष्टियों को वापस पढ़ने की क्षमता के आधार पर, मैं उम्मीद कर रहा हूं कि इनमें से कोई भी आउटपुट का उत्पादन करने के लिए काम करे, अगर यह मेरे इच्छित तरीके से स्वरूपित न हो। ऐसा नहीं होता है।

अगले ATTEMPT

वेलामास का उदाहरण लेते हुए, मैंने निर्देशों का पालन करने की कोशिश की, लेकिन जहां हमें वही प्रतिक्रिया नहीं मिल रही है, वह पहले चरण में है। जहां वालमेस को .toDate () एक्सटेंशन के आधार पर आउटपुट मिलता है, मुझे एक त्रुटि मिलती है जिसमें कहा जाता है कि टॉड () एक फ़ंक्शन नहीं है।

Firebase प्रलेखन के अनुरूप, मैंने कोशिश की:

    const docRef = this.props.firebase.db.collection("users").doc("HnH5TeCU1lUjeTqAYJ34ycjt78w22");

docRef.get().then(function(docRef) {
    if (doc.exists) {
        console.log("Document createdAt:", docRef.createdAt.toDate());

}})

यह वाक्य रचना के साथ त्रुटियों की एक स्ट्रिंग पैदा करता है और मैं उनके आसपास एक रास्ता नहीं खोज सकता।

अगले ATTEMPT

फिर मैंने यह देखने के लिए एक नया रूप बनाने की कोशिश की कि क्या मैं उपयोगकर्ताओं के फॉर्म के प्रमाणीकरण पहलू के बिना यह पता लगा सकता हूं।

मेरे पास एक फॉर्म है जो इनपुट के रूप में लेता है:

this.props.firebase.db.collection("insights").add({
            title: title,
            text: text,
            // createdAt1: new Date(),
            createdAt: this.props.firebase.fieldValue.serverTimestamp()
        })

जहां पिछले रूप में, नया दिनांक () प्रयास डेटाबेस में एक तारीख दर्ज करने के लिए काम करता है, इस उदाहरण में createAt और createAt1 दोनों फ़ील्ड समान डेटाबेस प्रविष्टि उत्पन्न करते हैं:

यहां छवि विवरण दर्ज करें

<div>{item.createdAt.toDate()}</div>
                    <div>{item.createdAt.toDate()}</div>

जब मैं तारीखों के मूल्य को आउटपुट करने की कोशिश करता हूं, तो पहले वाला एक त्रुटि उत्पन्न करता है जो कहता है:

ऑब्जेक्ट एक रिएक्ट बच्चे के रूप में मान्य नहीं हैं (पाया गया: सन 15 दिसंबर 2019 21:33:32 GMT + 1100 (ऑस्ट्रेलियाई पूर्वी डेलाइट समय))। यदि आप बच्चों के संग्रह को प्रस्तुत करना चाहते हैं, तो इसके बजाय एक सरणी का उपयोग करें

दूसरा यह कहते हुए त्रुटि उत्पन्न करता है:

TypeError: अपरिभाषित की संपत्ति 'toate' नहीं पढ़ सकता है

मैं विचारों के लिए फंस गया हूं कि आगे क्या करना है।

मैंने इस पोस्ट को देखा जो बताता है कि निम्नलिखित कुछ उपयोगी हो सकता है:

                {item.createdAt1.Date.valueOf()}

यह नहीं है यह कहता है कि एक त्रुटि प्रदान करता है:

TypeError: अपरिभाषित की संपत्ति 'तारीख' नहीं पढ़ सकता है

इस पोस्ट से मुझे भी उतना ही परेशानी हो रही है, लेकिन वे इस बात पर ध्यान नहीं देते हैं कि वे अपने द्वारा संग्रहित दिनांक मान को प्रदर्शित करने में कैसे कामयाब रहे।

यह पोस्ट ऐरे एरर मैसेज पर अटकती दिख रही है, लेकिन लगता है कि कैसे बनाया गया।

जवाबों:


1

कुछ चर्चा के बाद, हमने पाया कि ओपी उपयोगकर्ता वस्तु में समय स्टैम्प इस तरह से प्रस्तुत किया जा सकता है:

render() { 
const { users, loading } = this.state; 

return ( 
    <div> 
        {loading && <div>Loading ...</div>} 

        {users.map(user => ( 

            <Paragraph key={user.uid}> 

                <key={user.uid}> 
                    {user.email} 
                    {user.name} 
                    {new Date(user.createdAt.seconds * 1000).toLocaleDateString("en-US")}

मैंने एक डमी रिएक्ट प्रोजेक्ट में आपके उदाहरण को फिर से बनाया, और उम्मीद के मुताबिक त्रुटि प्राप्त की।

त्रुटि: ऑब्जेक्ट प्रतिक्रियाशील बच्चे के रूप में मान्य नहीं हैं

मैं निम्नलिखित विधि से इसे सही ढंग से प्रस्तुत करने में सक्षम था, जो आपके लिए भी काम करना चाहिए:

{new Date(user.createdAt._seconds * 1000).toLocaleDateString("en-US")}

मेरे नमूने टाइमस्टैम्प के लिए, जिसे निम्न रूप में प्रस्तुत किया गया है:

2019/12/30


सुनिश्चित करें कि आप एक टाइमस्टैम्प का उपयोग कर रहे हैं जिसे फायरस्टार के रूप में सहेजा गया था:

createdAt: this.props.firebase.Timestamp.fromDate(new Date())

नोट: यह मानकर चल रहा है कि आपका उदाहरण firebase.firestore()हैthis.props.firebase । अन्य उदाहरणों में आप इसका उपयोग करते हैं। Props.firebase, लेकिन वे विधियाँ सहायक विधियों की तरह दिखती हैं जिन्हें आपने स्वयं बनाया है।

जब यह मान प्राप्त किया जाता है, तो यह दो गुणों वाला एक ऑब्जेक्ट होगा - _secondsऔर _nanoseconds

अंडरस्कोर शामिल करना सुनिश्चित करें। यदि आप इसका उपयोग createdAt.secondsकरते हैं तो यह काम नहीं करेगा, यह होना चाहिए createdAt._seconds


अन्य चीजें जो मैंने कोशिश कीं:

user.createdAt.toDate()फेंकता है toDate() is not a function

user.createdAt फेंकता Error: Objects are not valid as a React child

new Date(user.createdAt._nanoseconds) गलत तारीख का प्रतिपादन करता है


हाय - सुझाव के लिए धन्यवाद। मैंने यह कोशिश की और एक त्रुटि मिली जो कहती है: टाइपर्रर: अपरिभाषित की संपत्ति 'टाइमस्टैम्प' को नहीं पढ़ सकता है
मेल

मैंने यह भी कोशिश की: createAt: firebase.firestore.fieldValue.serverTimestamp ()। FromDate (नई तिथि ()), जो एक त्रुटि लौटाती है जो कहती है: टाइपर्रर: अपरिभाषित की संपत्ति 'फ़ील्डवैल्यू' को नहीं पढ़ सकता है
Mel

हालांकि यह मेरे लिए काम नहीं करता था, मुझे यह समझने में दिलचस्पी है कि आपके द्वारा उपयोग किए गए प्रारूप को आज़माने के लिए आप कैसे सोचते हैं। यह प्रलेखन में नहीं दिखाया गया है। अगर मैं सीख सकता हूं कि आपने कैसे कुछ खोजा है जो आपके लिए काम करता है, तो हो सकता है कि मुझे कोई ऐसा तरीका मिल जाए जो मेरे लिए काम करे (मुझे समझ में नहीं आता कि वे सभी के लिए समान क्यों नहीं हैं - लेकिन मुझे चीजों की कोशिश करने के लिए नए विचारों की आवश्यकता है )। मदद करने की कोशिश करने के लिए फिर से धन्यवाद।
मेल

मैं क्या कर सकता हूं एक तिथि (जैसा कि ऊपर दिखाया गया है) का उपयोग करके सहेजा गया है: createAt: this.props.firebase.fieldValue.serverTimestamp (),
Mel


5

जब आप फायरस्टार से टाइमस्टैम्प प्राप्त करते हैं तो वे निम्न प्रकार के होते हैं:

यहां छवि विवरण दर्ज करें

इसे एक सामान्य टाइमस्टैम्प में बदलने के लिए आप .toDate () फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण के लिए, निम्नलिखित जैसे दस्तावेज़ के लिए:

यहां छवि विवरण दर्ज करें

हम कुछ का उपयोग कर सकते हैं जैसे:

db.collection('[COLLECTION]').doc('[DOCUMENT]').get().then(function(doc) {
  console.log(doc.data().[FIELD].toDate());
});

और आउटपुट इस प्रकार होगा:

2019-12-16T16:27:33.031Z

अब उस टाइमस्टैम्प को और संसाधित करने के लिए, आप इसे एक स्ट्रिंग में बदल सकते हैं और अपनी जरूरतों के अनुसार इसे संशोधित करने के लिए रेगेक्स का उपयोग कर सकते हैं।

उदाहरण के लिए: (मैं यहाँ Node.js का उपयोग कर रहा हूँ)

db.collection('[COLLECTION]').doc('[DOCUMENT]').get().then(function(doc) {
  var stringified = doc.data().[FIELD].toDate().toISOString();
  //console.log(stringified);
  var split1 = stringified.split('T');
  var date = split1[0].replace(/\-/g, ' ');
  console.log(date);
  var time = split1[1].split('.');
  console.log(time[0]);
});

आपको इस तरह एक आउटपुट देगा:

यहां छवि विवरण दर्ज करें


उदाहरण के लिए धन्यवाद। मेरे प्रयास में एक ही संरचना है। यह दस्तावेज़ में सभी स्ट्रिंग मानों को वापस करने के लिए काम करता है लेकिन तारीख नहीं। इसके बजाय, यह मेरे द्वारा ऊपर पोस्ट किए गए संदेश के साथ एक त्रुटि उत्पन्न करता है। इसका कोई मतलब नहीं है। मैंने toISOString () एक्सटेंशन को जोड़ने की कोशिश की, लेकिन यह त्रुटि संदेश नहीं बदलता है (जो कि केवल स्वरूपण होना चाहिए)
Mel

क्या आप कंसोल में टाइमस्टैम्प का मान लॉग कर सकते हैं? बस यह पुष्टि करने के लिए कि फायरस्टार टाइमस्टैम्प का सही प्रकार है। @ माइल
वेलामास

नहीं - कंसोल लॉग काम नहीं करता है - यह एक त्रुटि भी उत्पन्न करता है - लेकिन तारीख तालिका में बनाए गए फ़ील्ड में दर्ज हो जाती है - अब मैं इसे वापस पढ़ने की कोशिश कर रहा हूं। मैंने एक पोस्ट बनाई जिसमें बताया गया कि मुझे रिकॉर्ड करने की तारीख कैसे मिली (फायरबेस डॉक्यूमेंटेशन के अनुसार नहीं): stackoverflow.com/questions/59257755/…
Mel

चूंकि आप आधिकारिक डॉक्स द्वारा सुझाए गए एक से एक अलग दृष्टिकोण का पालन कर रहे हैं, मुझे यकीन नहीं है कि वास्तव में क्या गलत हो रहा है। ऐसा लगता है कि आप जिस तरह से पहली बार टाइमस्टैम्प बना रहे हैं और धक्का दे रहे हैं वह किसी तरह दोषपूर्ण है। जब आप फायरस्टैम्प को फायरस्टार पर संग्रहीत करते हैं तो मुझे अपने उत्तर की शुरुआत में जिस प्रारूप का उल्लेख करना चाहिए, उसका एक उद्देश्य होना चाहिए। इस तरह यह वैध टाइमस्टैम्प के रूप में पहचाना जाता है जिसे तब .toDate () के साथ उपयोग किया जा सकता है। Firestore.Timestamp.now () आपको इसे जांचने के लिए सही प्रारूप का टाइमस्टैम्प देगा। @ मेल
वेलामास

मैंने टाइम स्टैम्प बनाने के लिए आधिकारिक दस्तावेज का पालन करने की कोशिश की। मैं इसे काम नहीं कर सका। मैं एक तारीख रिकॉर्ड करने के लिए एक वैकल्पिक रास्ते पर ठोकर खाई और अब आउटपुट वापस नहीं पढ़ सकता! कितना निराशाजनक। वैसे भी मदद करने की कोशिश करने के लिए धन्यवाद।
मेल

2

तो आग्नेयास्त्र सेकंड और नैनोसेकंड के साथ एक वस्तु के रूप में तारीखें रखता है। यदि आप उस समय को चाहते हैं जब उपयोगकर्ता बनाया गया था तो आप संदर्भ देंगे user.createdAt.nanoseconds। यह यूनिक्स टाइमस्टैम्प लौटाता है।

आप अपने ऐप में दिनांक कैसे प्रदर्शित करना चाहते हैं? यदि आप डेट ऑब्जेक्ट प्राप्त करना चाहते हैं तो आप टाइमस्टैम्प को डेट कंस्ट्रक्टर में पास कर सकते हैं new Date(user.createdAt.nanoseconds)। व्यक्तिगत रूप से मुझे समय से निपटने के लिए दिनांक-fns पुस्तकालय का उपयोग करने में आनंद आता है ।


धन्यवाद - मैंने इस सुझाव की कोशिश की। यह एक त्रुटि देता है जो कहता है: TypeError: अपरिभाषित की संपत्ति 'नैनोसेकंड' नहीं पढ़ सकता है। मैं आपके द्वारा अभी सुझाए गए पुस्तकालय पर एक नज़र
मेल

क्या आप createAt लॉग इन कर सकते हैं और कृपया साझा कर सकते हैं। डेटा की एस्किंट प्रकृति को देखते हुए, आपको शायद इसे ऐसे ही वापस करने की आवश्यकता है user.createdAt && new Date(user.createdAt.nanoseconds)। दिनांक-fns इस समस्या के साथ मदद नहीं करेगा, कि आपके पास एक बार दिनांक प्रदर्शित करने के लिए एक आसान पुस्तकालय।
जोश पिटमैन

createAt ड्रॉपडाउन मेनू की एक लंबी सूची में प्रवेश करता है। मैं एक फायरस्टार में क्षेत्र में दिखाई गई तारीख से युक्त नहीं पा सकता हूं। पहला हिस्सा है: createdAt: ServerTimestampFieldValueImpl _methodName: "FieldValue.serverTimestamp" आद्य : FieldValueImpl निर्माता: ƒ ServerTimestampFieldValueImpl () उदाहरण: ServerTimestampFieldValueImpl _methodName: "FieldValue.serverTimestamp" आद्य : FieldValueImpl निर्माता: ServerTimestampFieldValueImpl ƒ () उदाहरण: ServerTimestampFieldValueImpl {_methodName: " FieldValue.serverTimestamp "} तर्क: (...) कॉलर: (...)
मेल

ऐसा लगता है कि आपने टाइमस्टैम्प फ़ंक्शन को डेटाबेस में धकेल दिया है, वास्तविक टाइमस्टैम्प नहीं। आप टाइमस्टैम्प कैसे सेट कर रहे हैं? firestore.FieldValue.serverTimestamp()
जोश पिटमैन

फायरस्टार में दिख रही प्रविष्टि वह फ़ोटो है जो मैंने संलग्न की है। यह प्रविष्टि है: this.props.firebase.fieldValue.serverTimestamp ()
Mel

2

फायरस्टार को तारीख कैसे भेजें:

import firebase from 'firebase/app';

// ..........
// someObject is the object you're saving to your Firestore.

someObject.createdAt: firebase.firestore.Timestamp.fromDate(new Date())

इसे वापस कैसे पढ़ें:

function mapMonth(monthIndex) {
  const months = {
    0: 'jan',
    1: 'feb',
    2: 'mar',
    3: 'apr',
    4: 'may',
    5: 'jun',
    6: 'jul',
    7: 'aug',
    8: 'sep',
    9: 'oct',
    10: 'nov',
    11: 'dec'
  };
  return months[monthIndex];
}

// ..........
// Here you already read the object from Firestore and send its properties as props to this component.

return(
    <LS.PostDate_DIV>
      Published on {mapMonth(props.createdAt.toDate().getMonth()) + ' '}
      of {props.createdAt.toDate().getFullYear()}
    </LS.PostDate_DIV>
  );
}

मूल रूप से जब आप createdAt.toDate()एक जे एस तिथि वस्तु प्राप्त करते हैं।

मैं इसे हर समय इस तरह उपयोग करता हूं!

से: https://cloud.google.com/firestore/docs/manage-data/add-data

यहां छवि विवरण दर्ज करें

यह उपयोगकर्ता के सिस्टम की तारीख के आधार पर एक डेटा बनाएगा। यदि आपको यह सुनिश्चित करने की आवश्यकता है कि आपके DB पर सब कुछ कालानुक्रमिक रूप से संग्रहीत किया जाएगा (गलत सिस्टम दिनांक के किसी भी त्रुटि के बिना), तो आपको एक सर्वर टाइमस्टैम्प का उपयोग करना चाहिए। आपके फायरस्टार डीबी आंतरिक तिथि प्रणाली का उपयोग करके तिथि निर्धारित की जाएगी।

यहां छवि विवरण दर्ज करें


इसके लिए धन्यवाद, लेकिन मैं जिस परेशानी को दूर करने की कोशिश कर रहा हूं, वह यह है कि मुझे डेटाबेस में दर्ज तारीख को प्रदर्शित करने का कोई तरीका नहीं मिल रहा है। मैं अपने द्वारा साझा किए गए प्रकारों की त्रुटियाँ प्राप्त करता रहता हूँ।
मेल

2

किसी उपयोगकर्ता की createdAtप्रॉपर्टी सेट के डॉक्यूमेंट आईडी के साथ , निम्नलिखित प्रयास करें:

const docRef = db.collection("users").doc("[docID]");

docRef.get().then(function(docRef) {
  if (docRef.exists) {
     console.log("user created at:", docRef.data().createdAt.toDate());
  }
})

.data()दस्तावेज़ के गुणों तक पहुँचने से पहले विधि को कॉल करना महत्वपूर्ण है

ध्यान दें कि यदि आप docRef.data().createdAt.toDate()किसी ऐसे उपयोगकर्ता का उपयोग करते हैं जिसके लिए createdAtउचित सेट नहीं है, तो आपको मिलेगाTypeError: Cannot read property 'toDate' of undefined

इसलिए यदि आपके पास अपने संग्रह में कोई उपयोगकर्ता है जिसकी कोई createdAtसंपत्ति परिभाषित नहीं है। आपको यह जांचने के लिए तर्क लागू करना चाहिए कि उपयोगकर्ता के पास createdAtसंपत्ति है या नहीं। आप ऐसा कुछ कर सकते हैं:

//This code gets all the users and logs it's creation date in the console
docRef.get().then(function(docRef) {
  if (docRef.exists && docRef.data().createdAt) {
      console.log("User created at:", docRef.data().createdAt.toDate());
  }
})

जैसा कि आप ऊपर देख सकते हैं, मैं दस्तावेज़ फ़ील्ड के लिए अपने अनुरोधों में डेटा () का उपयोग करता हूं। अगर मैं अन्य क्षेत्रों रेंडर नहीं किया था। विशिष्ट मुद्दा टाइम स्टैम्प के साथ है, जो रेंडर नहीं करता है। मेरे द्वारा किए गए प्रयासों में से एक, और जो मैंने ऊपर सेट किया है, उसमें टॉड () एक्सटेंशन का उपयोग करने का प्रयास शामिल है। यह काम नहीं करता है - उपरोक्त कारणों के लिए। वैसे भी आपके समय के लिए धन्यवाद।
मेल

0

मैं सूचियों जहां में सही प्रकार से प्रस्तुत नहीं नेस्टेड वस्तु गुण के साथ अतीत में समस्याओं का सामना किया है item.somePropएक वस्तु माना जाता है, लेकिन item.someProp.someSubPropके मूल्य के साथ मामला नहीं सुलझेगा someSubPropमें item.someProp

तो इस मुद्दे के आसपास स्कर्ट करने के लिए, उपयोगकर्ता ऑब्जेक्ट बनाते समय एक सादे तिथि ऑब्जेक्ट (या वांछित प्रदर्शन प्रारूप) के लिए टाइमस्टैम्प का मूल्यांकन क्यों नहीं किया जाता है?

this.unsubscribe = this.props.firebase
  .users()
  .onSnapshot(snapshot => {
    let users = [];

    snapshot.forEach(doc =>
      let docData = doc.data();
      docData.createdAt = docData.createdAt.toDate();
      users.push({ ...docData, uid: doc.id }),
    );

    this.setState({
      users,
      loading: false,
    });
  });

यह भी ध्यान देने योग्य है कि दोनों DocumentSnapshot#data()और DocumentSnapshot#get()एक ऐसी वस्तु को स्वीकार करते हैं जो निर्दिष्ट करती है कि कैसे नहीं अभी तक अंतिम FieldValue.serverTimestamp()मूल्यों को संभालना है । डिफ़ॉल्ट रूप से, एक अभी तक अंतिम रूप नहीं दिया जाएगा। उपयोग करने { serverTimestamps: "estimate"}से इन अशक्त मूल्यों को एक अनुमान में बदल दिया जाएगा।
samthecodingman

हाय - सुझाव के लिए धन्यवाद। मैं इसे आज़माना चाहता हूँ, लेकिन मुझे यह समझ में नहीं आ रहा है - या मैं इसे कैसे लागू करने की कोशिश कर सकता हूँ। क्या इस सुझाव के साथ आने वाले सिद्धांतों के लिए एक सम्मेलन है। यदि मुझे दृष्टिकोण के बारे में साहित्य मिल सकता है, तो मैं यह पता लगाने की कोशिश करूँगा कि आपका विचार कैसे काम करता है ताकि मैं इसे अपने कोड में आज़मा सकूं।
मेल

मुझे इसके लिए कोई विशेष संसाधन नहीं मिला है, जैसा कि मैंने वर्षों में अन्य स्टैकऑवरफ्लो प्रश्नों को देखने के बाद उठाया ।
samthecodingman

साझा करने के लिए धन्यवाद। मैं आज रात
मेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.