Javascript “我该如何解决?”;无法读取未定义的属性匹配;在此代码中

Javascript “我该如何解决?”;无法读取未定义的属性匹配;在此代码中,javascript,nativescript,nativescript-plugin,Javascript,Nativescript,Nativescript Plugin,我正在尝试将nativescript imagepicker插件集成到我的nativescript应用程序中,但出现错误**无法读取**未定义的属性匹配**** 下面是我已经尝试过的,谢谢 function onSelectSingleTap(args) { var context = imagepickerModule.create({ mode: "single" }); if (platformModule.device.os === "Andr

我正在尝试将nativescript imagepicker插件集成到我的nativescript应用程序中,但出现错误**无法读取**未定义的属性匹配**** 下面是我已经尝试过的,谢谢

function onSelectSingleTap(args) {  
    var context = imagepickerModule.create({
        mode: "single"
    });
    if (platformModule.device.os === "Android" && platformModule.device.sdkVersion >= 23) {   
        permissions.requestPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE, "I need these permissions to read from storage")
        .then(function() {
            console.log("Permissions granted!");
            startSelection(context);
        })
        .catch(function() {
            console.log("Uh oh, no permissions - plan B time!");
        });
    } else {
        startSelection(context);
    }
}

function sendImages(selected) {
    let fileUri = selected.fileUri;
    imageName = extractImageName(fileUri);

    var request = {
        url: "http://vvvvvv.com/skog/upload.php",
        method: "POST",
        headers: {
            "Content-Type": "application/octet-stream",
            "File-Name": imageName
        },
        description: "{ 'uploading': " + imageName + " }"
    };
    //get the image source and upload from there
    selected.getImage().then(imageSource => {
        let temp = fs.knownFolders.temp();
        let uniqueName = '_' + Math.random().toString(36).substr(2, 9);
        let filePath = fs.path.join(temp.path, uniqueName + ".jpg");
        let saved = imageSource.saveToFile(filePath, enums.ImageFormat.jpeg);
        console.log(`item saved:${saved}`);
        var task = session.uploadFile(filePath, request);

        task.on("progress", logEvent);
        task.on("error", logEvent);
        task.on("complete", x => cleanFile(filePath));
    });
    //return task;
}
function logEvent(e) {      
        console.log("----------------");
        console.log('Status: ' + e.eventName);
        console.log('Error: ' + e.error);
        // console.log(e.object);
        if (e.totalBytes !== undefined) {
            console.log('current bytes transfered: ' + e.currentBytes);
            console.log('Total bytes to transfer: ' + e.totalBytes);
        }  
    }
function cleanFile(file){
    fs.remove(file);
}
function startSelection(context) {
    context
        .authorize()
        .then(function() {
            imageItems.length = 0;
            return context.present();
        })
        .then(function(selection) {
            selection.forEach(function(selected) {
                sendImages(selected);
                //selected.uploadTask = sendImages(selected);             
                selected.imageName = imageName;

                console.log("----------------");
                console.log("uri: " + selected.uri);           
                console.log("fileUri: " + selected.fileUri);
                console.log('Image name:' + imageName);

                imageItems.push(selected);
            });
            //list.items = selection;
        }).catch(function (e) {
      console.log(e);
      alert(e.message);
        });
}
function extractImageName(fileUri) {
  var pattern = /[^/]*$/;
  var imageName = fileUri.match(pattern);

  return imageName[0];
}
我不认为错误来自php,这就是为什么我不在问题中添加代码的原因,但是如果你不这么认为,请让我知道
请帮助

选择
是一个数组,因此选择了
。getImage()
显然是
未定义的
。它只有
getImageAsync(…)
,但返回本机图像数据

要从资产创建,应使用
fromsets
方法

fileUri
也是
未定义的
,没有这样的属性。我不知道你是从哪里挑选的。我建议您参考文档中所有有效的属性和方法。

这样就可以了

function onSelectSingleTap(args) {
      var context = imagepickerModule.create({
          mode: "single"
      });

      if (platformModule.device.os === "Android" && platformModule.device.sdkVersion >= 23) {
          permissions.requestPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE, "I need these permissions to read from storage")
              .then(function () {
                  console.log("Permissions granted!");
                  startSelection(context);
              })
              .catch(function () {
                  console.log("Uh oh, no permissions - plan B time!");
              });
      } else {
          startSelection(context);
      }
    }


    function startSelection(context) {

      context
          .authorize()
          .then(function () {

              return context.present();
          })
          .then(function (selection) {
            selection.forEach(function(selected) {
              //alert(selected.android.toString()); 
              var file =  selected.android.toString();
              var url = "https://adekunletestprojects.000webhostapp.com/skog/upload.php";
              var name = file.substr(file.lastIndexOf("/") + 1);
              //alert(name);
              var bghttp = require("nativescript-background-http");
              var session = bghttp.session("image-upload");
              var request = {
              url: url,
              method: "POST",
              headers: {
                  "Content-Type": "application/octet-stream",
                  "File-Name": name
              },
            description: "Uploading " + name
        };

            var task = session.uploadFile(file, request);
            task.on("progress", progressHandler);
            return task;
            function progressHandler(e) {
              var toast = Toast.makeText("uploaded " + e.currentBytes + " / " + e.totalBytes);
              toast.show();
          }
            });
          }).catch(function (e) {
              console.log(e.eventName);
              alert(e.message);
          });
    }

说明:“{‘上传’:“+imageName+”}”
 — 看起来不太好。它不是JSON,并且
imageName
将不带引号。您没有以任何方式解析它,是吗?在调用
extractImageName
时,您是否可以验证您正在传递字符串?